1.3(设计模式)建造模式

建造模式将多个简单对象一步步构造成一个复杂对象。

例如快餐店的套餐,有双层吉士堡套餐(双层吉士堡+可口可乐),麦辣鸡腿堡套餐(麦辣鸡腿堡+百事可乐)。

这些套餐都是由汉堡+饮料组合(也可以看做是构建)起来的。

定义了这些简单对象(具体的汉堡和饮料),后续就可以将其组合构建成多个套餐。

 Item接口中有获取商品的包装,名称,价格的方法。

定义包装接口Packing,包装纸(Wrapper)和瓶子(Bottle)实现了Packing接口

抽象类Burger、ColdDrink实现了Item接口中的pack,返回类型为Packing.

具体的VegBurger继承Burger接口,由于抽象类Burger实现了接口的pack方法,

所以VegBurger继承Burger时只需要实现price和name方法。

Meal中定义了一个Item类型的集合,用于存放商品(汉堡、冷饮)。

还定义了设置商品,计算商品价格、展示商品的方法。

MealBuild用于建造商品套餐(Meal),例如蔬菜汉堡+可乐 = 素食套装。

 定义Item(商品接口),商品(汉堡,可乐等)需包含名称,价格,包装(汉堡用纸包,可乐使用瓶子)。

public interface Item {
    public String name();
    public Packing packing();
    public float price();
}

定义包装接口

public interface Packing {
    public String pack();
}

 汉堡实现商品接口,由于汉堡是抽象了,所以可以不实现Item接口所有方法。

public abstract class Burger implements Item{

    @Override
    public Packing packing() {
        // TODO Auto-generated method stub
        return new Wrapper();
    }    
}

冷饮继承了Item接口

public abstract class ColdDrink implements Item{

    @Override
    public Packing packing() {
        // TODO Auto-generated method stub
        return new Bottle();
    }
    
}

包装纸实现了Packing(包装)接口

public class Wrapper implements Packing{

    @Override
    public String pack() {
        return "Wrapper";
    }

}

Bottle(瓶子)实现了Packing接口

public class Bottle    implements Packing {

    @Override
    public String pack() {
        return "Bottle";
    }
    
}

VegBurger(蔬菜汉堡) 继承自汉堡,Burger是抽象类并且实现了Item接口中的pack方法,故VegBurger继承Burger后,只需重写Item接口中Burger没有实现的方法即可。

故只需实现name(),price().

public class VegBurger extends Burger{

    @Override
    public String name() {
        // TODO Auto-generated method stub
        return "VegBurger";
    }

    @Override
    public float price() {
        // TODO Auto-generated method stub
        return 20.0f;
    }

}

Coke继承冷饮,也只用实现Item接口中ColdDrink没有实现的方法。

public class Coke extends ColdDrink{

    @Override
    public String name() {
        // TODO Auto-generated method stub
        return "Coke";
    }

    @Override
    public float price() {
        // TODO Auto-generated method stub
        return 5.0f;
    }
}

Meal对象类包含多个Item.

import java.util.ArrayList;
import java.util.List;

public class Meal {
    private List<Item> items = new ArrayList<Item>();
    
    public void addItem(Item item) {
        items.add(item);
    }
    
    public float getCost() { //计算总价
        float cost = 0.0f;
        for(Item item:items) {
            cost += item.price();
        }
        return cost;
    }
    
    public void showItem() { //展示套餐内容
        for(Item item:items) {
            System.out.println("name:"+item.name());
            System.out.println("price:"+item.price());
            System.out.println("packing:"+item.packing().pack());
            
        }
        System.out.println("--:" + getCost());
    }
}

MealBuilder构建Meal,可以根据具体需求构建不同Meal。

public class MealBuilder {
    public Meal createVagMeal() {//创建蔬菜汉堡套餐,也可根据需要创建其他汉堡套餐,添加一个create方法即可。
        Meal vagMeal = new Meal();
        vagMeal.addItem(new VegBurger());
        vagMeal.addItem(new Coke());
        return vagMeal;
    } 
    
}

测试:

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MealBuilder mealBuilder = new MealBuilder();
        Meal veg = mealBuilder.createVagMeal();
        veg.showItem();
    }

}

参考资料:

http://www.runoob.com/design-pattern/builder-pattern.html

原文地址:https://www.cnblogs.com/huang-changfan/p/10719292.html