I have a project where I am asked to include at least one structural design pattern, and I chose the a desktop app for food delivery, my thoughts where that I have an abstract class FoodElement that derives VeganFoodElement and a NormalFoodElement. Now for each category I can either choose a dish or a drink, can I separate them this way?
public abstract class FoodElement { private String elementName; private float elementPrice; public abstract void showFoodElement(); public abstract float getPrice(); } public class NormalFoodElement extends FoodElement{ private TypeElementRepas elementNormal; @Override public void afficherElementRepas() {} @Override public float getPrix() {} } public interface TypeFoodElement { void showAttributes(); } public class Drink implements TypeFoodElement { private int sugarQuantity=0; @Override public void showAttributes() {} @Override public void addSugar() { this.sugarQuantity += 1; } } public class Dish implements TypeFoodElement { @Override public void showAttributes() { } }
Advertisement
Answer
I recommend that you choose the Decorator pattern. This pattern helps you to use some elements to make new elements. For Example new Seafood(new BasicFood())
.
You can read more here
And here an example
public interface Food { public String prepareFood(); public double foodPrice(); }// End of the Food interface. public class VegFood implements Food { public String prepareFood(){ return "Veg Food"; } public double foodPrice(){ return 50.0; } } public abstract class FoodDecorator implements Food{ private Food newFood; public FoodDecorator(Food newFood) { this.newFood=newFood; } @Override public String prepareFood(){ return newFood.prepareFood(); } public double foodPrice(){ return newFood.foodPrice(); } } public class NonVegFood extends FoodDecorator{ public NonVegFood(Food newFood) { super(newFood); } public String prepareFood(){ return super.prepareFood() +" With Roasted Chiken and Chiken Curry "; } public double foodPrice() { return super.foodPrice()+150.0; } } public class ChineeseFood extends FoodDecorator{ public ChineeseFood(Food newFood) { super(newFood); } public String prepareFood(){ return super.prepareFood() +" With Fried Rice and Manchurian "; } public double foodPrice() { return super.foodPrice()+65.0; } } import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class DecoratorPatternCustomer { private static int choice; public static void main(String args[]) throws NumberFormatException, IOException { do{ System.out.print("========= Food Menu ============ n"); System.out.print(" 1. Vegetarian Food. n"); System.out.print(" 2. Non-Vegetarian Food.n"); System.out.print(" 3. Chineese Food. n"); System.out.print(" 4. Exit n"); System.out.print("Enter your choice: "); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); choice=Integer.parseInt(br.readLine()); switch (choice) { case 1:{ VegFood vf=new VegFood(); System.out.println(vf.prepareFood()); System.out.println( vf.foodPrice()); } break; case 2:{ Food f1=new NonVegFood((Food) new VegFood()); System.out.println(f1.prepareFood()); System.out.println( f1.foodPrice()); } break; case 3:{ Food f2=new ChineeseFood((Food) new VegFood()); System.out.println(f2.prepareFood()); System.out.println( f2.foodPrice()); } break; default:{ System.out.println("Other than these no food available"); } return; }//end of switch }while(choice!=4); } }