import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Comida {
private Integer id;
private String nombre;
private Precio precio;
public Comida(String nombre, Precio precio) {
this.nombre = nombre;
this.precio = precio;
}
public Precio getPrecio() {
return precio;
}
public void setPrecio(Precio precio) {
this.precio = precio;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "Comida: " + this.nombre+"\tPrecio: "+this.precio.getPrecio();
}
}
class Precio {
private Integer id;
private Double precio;
public Precio(Double precio) {
super();
this.precio = precio;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Double getPrecio() {
return precio;
}
public void setPrecio(Double precio) {
this.precio = precio;
}
}
interface GenericDAO<T> {
//Simula el insert en el DBMS .. insert into ....
Integer create(T t);
//Simula el select * en el DBMS .. select * from ....
List<T> retrieveAll();
//Simula el select * .. where id = . en el DBMS .. select * from .. where id = ....
T retrieveById(Integer id);
//Simula el update .. set precio = .. where id= ....
Integer update(Integer id, T t);
//Simula el delete from ... where id =
Integer delete(Integer id);
//Para proósitos de simulación
Integer getLastInsertId();
}
class ComidaDAOImpl implements GenericDAO<Comida> {
//Simula una sequence en el DBMS
private static Integer LAST_INSERT_ID = 0;
//Simula los registros en el DBMS
private static List<Comida> comidas = new ArrayList<Comida>();
private static class StaticHolder {
public static ComidaDAOImpl instance = new ComidaDAOImpl() ;
}
//Singleton
private ComidaDAOImpl() {}
public static GenericDAO<Comida> getInstance() {
return StaticHolder.instance;
}
@Override
public Integer create(Comida t) {
comidas.add(LAST_INSERT_ID++, t);
//Teroricamente insertamos un registro
return 1;
}
@Override
public List<Comida> retrieveAll() {
return comidas;
}
@Override
public Comida retrieveById(Integer id) {
return null;
}
@Override
public Integer update(Integer id, Comida t) {
return null;
}
@Override
public Integer delete(Integer id) {
return null;
}
@Override
public Integer getLastInsertId() {
return LAST_INSERT_ID;
}
}
class PrecioDAOImpl implements GenericDAO<Precio> {
//Simula una sequence en el DBMS
private static Integer LAST_INSERT_ID = 0;
//Simula los registros en el DBMS
private static List<Precio> precios = new ArrayList<Precio>();
private static class StaticHolder {
public static PrecioDAOImpl instance = new PrecioDAOImpl() ;
}
//Singleton
private PrecioDAOImpl() {}
public static GenericDAO<Precio> getInstance() {
return StaticHolder.instance;
}
@Override
public Integer create(Precio t) {
precios.add(LAST_INSERT_ID++, t);
//Teroricamente insertamos un registro
return 1;
}
@Override
public List<Precio> retrieveAll() {
return precios;
}
@Override
public Precio retrieveById(Integer id) {
return null;
}
@Override
public Integer update(Integer id, Precio t) {
return null;
}
@Override
public Integer delete(Integer id) {
return null;
}
@Override
public Integer getLastInsertId() {
return LAST_INSERT_ID;
}
}
class Comensal {
//Las comidas del comensal
private List<Comida> comidas = new ArrayList<Comida>();
private List<Integer> raciones = new ArrayList<Integer>();
public List<Comida> getComidas() {
return comidas;
}
public void agregarComida(Comida comida, Integer raciones) {
this.comidas.add(comida);
this.raciones.add(raciones);
}
public void imprimirCuenta() {
//Si no hay comidas, es decir el comensal no ha consumido, no hacer algo.
if(0 == comidas.size()) {
return;
}
System.out.println("Restaurante el buen gusto");
System.out.println("Platillo\tRaciones\tPrecio");
Double importe = 0d;
for(int i = 0 ;i<comidas.size();i++) {
importe += comidas.get(i).getPrecio().getPrecio()*raciones.get(i);
System.out.println(comidas.get(i).getNombre() +"\t"+raciones.get(i)+"\t"+comidas.get(i).getPrecio().getPrecio());
}
System.out.println("Importe total: "+(importe*1.18d)+"\n");
}
}
public class Restaurante {
private static void setup() {
//Insertar 10 precios
//Obtener la instancia del DAO
GenericDAO<Precio> precioDAO = PrecioDAOImpl.getInstance();
GenericDAO<Comida> comidaDAO = ComidaDAOImpl.getInstance();
precioDAO.create(new Precio(250.50d));
precioDAO.create(new Precio(250.50d));
precioDAO.create(new Precio(85.5d));
precioDAO.create(new Precio(30d));
precioDAO.create(new Precio(70d));
precioDAO.create(new Precio(65.2d));
precioDAO.create(new Precio(33.89d));
precioDAO.create(new Precio(65.10d));
precioDAO.create(new Precio(700d));
precioDAO.create(new Precio(1350.89d));
//Insertar 10 comidas
comidaDAO.create(new Comida("Alitas de pollo", null));
comidaDAO.create(new Comida("Venado", null));
comidaDAO.create(new Comida("Albongigas", null));
comidaDAO.create(new Comida("Res en chile pasilla", null));
comidaDAO.create(new Comida("Pato a la naranja", null));
comidaDAO.create(new Comida("Pollo a la naranja", null));
comidaDAO.create(new Comida("Hamburgues", null));
comidaDAO.create(new Comida("Enchiladas de pollo", null));
comidaDAO.create(new Comida("Camnarones U-15", null));
comidaDAO.create(new Comida("Ganso", null));
//Ralacionar comidas con precio
List<Comida> comidas = comidaDAO.retrieveAll();
List<Precio> precios = precioDAO.retrieveAll();
for(int i = 0 ; i <comidas.size();i++) {
comidas.get(i).setPrecio(precios.get(i));
}
}
private static void imprimirMenu() {
GenericDAO<Comida> comidaDAO = ComidaDAOImpl.getInstance();
List<Comida> comidas = comidaDAO.retrieveAll();
System.out.println("Menu\n");
int i;
for(i = 1 ; i< comidas.size(); i++ ) {
System.out.println(i+".- "+comidas.get(i-1));
}
System.out.println(i+".- No más platillos\n");
System.out.println("Opción: ");
}
private static void mainLoop() {
GenericDAO<Comida> comidaDAO = ComidaDAOImpl.getInstance();
List<Comida> comidas = comidaDAO.retrieveAll();
int opcion = comidas.size();
int raciones = 1;
Scanner scanner = null;
Comensal comensal = new Comensal();
try {
scanner = new Scanner(System.in);
do {
imprimirMenu();
opcion = scanner.nextInt();
if(opcion != comidas.size()) {
System.out.println("Raciones: ");
raciones = scanner.nextInt();
comensal.agregarComida(comidas.get(opcion-1), raciones);
}
}while(opcion!=comidas.size());
comensal.imprimirCuenta();
}catch(NumberFormatException nfe) {
System.out.println("Ups, parece que no se trata de un número");
}catch(Exception e) {
System.out.println("Algo fué realmente mal :(");
}finally {
scanner.close();
}
}
public static void main(String[] args) {
setup();
mainLoop();
}
}