• 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

  • 相关阅读:
    bzoj2732[HNOI2012]射箭
    poj1474 Video Surveillance
    bzoj3167[HEOI2013]SAO
    hdu2296 Ring
    bzoj2119 股市的预测
    bzoj2244[SDOI2011]拦截导弹
    bzoj3502[PA2012]Tanie Linie(最大k区间和)
    vijos1859[TJOI2014]电源插排
    比较SQL查询性能 语句
    什么是高内聚低耦合
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/10719292.html
Copyright © 2020-2023  润新知