//Main.java
//建造者模式Builder Pattern,创建型模式的一种
//主要用于自动生成复杂对象,即包含多个对象的对象(宏?)
//与工厂模式相比,建造者模式更加关注零件装配的顺序
//增加套餐种类直接在建造者类中添加相应建造代码即可
import java.util.List;
import java.util.ArrayList;
//包装接口与其实现
interface Packages{
public String getName();
}
class Bag implements Packages{
public String getName(){
return "Bag";
}
}
class Bottle implements Packages{
public String getName(){
return "Bottle";
}
}
//食物接口与其实现
interface Foods{
public String getName();
public Packages getPack();
public float getPrice();
}
//食物接口的第一层抽象类
abstract class Burger implements Foods{
public Packages getPack(){
return new Bag();
}
}
abstract class Drink implements Foods{
public Packages getPack(){
return new Bottle();
}
}
//食物接口的第二层实现类
//汉堡类
class ChickenBurger extends Burger{
public String getName(){
return "Chicken Burger";
}
public float getPrice(){
return 50.5f;
}
}
class VegBurger extends Burger{
public String getName(){
return "Veg Burger";
}
public float getPrice(){
return 25.0f;
}
}
//饮料类
class Coke extends Drink{
public String getName(){
return "Coke";
}
public float getPrice(){
return 30.0f;
}
}
class Pepsi extends Drink{
public String getName(){
return "Pepsi";
}
public float getPrice(){
return 35.0f;
}
}
class SetMenu{
private List<Foods> foods=new ArrayList<Foods>();
public void addFoods(Foods food){
foods.add(food);
}
public void showFoods(){
for(Foods food:foods){
System.out.println(food.getName()+"+"+food.getPack().getName()+"+"+food.getPrice());
}
}
public float getPrice(){
float price=0.0f;
for(Foods food:foods){
price+=food.getPrice();
}
return price;
}
}
class SetMenuBuilder{
public SetMenu prepareChickenSetMenu(){
SetMenu setmenu=new SetMenu();
setmenu.addFoods(new ChickenBurger());
setmenu.addFoods(new Coke());
return setmenu;
}
public SetMenu prpareVegSetMenu(){
SetMenu setmenu=new SetMenu();
setmenu.addFoods(new VegBurger());
setmenu.addFoods(new Pepsi());
return setmenu;
}
}
public class Main{
public static void main(String[] args){
SetMenuBuilder builder=new SetMenuBuilder();
SetMenu setmenu1=builder.prepareChickenSetMenu();
SetMenu setmenu2=builder.prpareVegSetMenu();
System.out.println("Chicken SetMenu:");
setmenu1.showFoods();
System.out.println("Total Price: "+setmenu1.getPrice());
System.out.println("----------------------");
System.out.println("Vegtable SetMenu:");
setmenu2.showFoods();
System.out.println("Total Price: "+setmenu2.getPrice());
}
}