码迷,mamicode.com
首页 > 其他好文 > 详细

创建型设计模式(三)建造者模式

时间:2019-07-21 18:06:26      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:vat   使用场景   end   item   items   ring   ott   bsp   eve   

一、一句话背景

假如我去麦当劳,麦当劳提供了多种多样的套餐供我选择,但是套餐组成无非就是汉堡、鸡翅、冷饮、薯条等这几种固定的东西,搭配不同就变成了不同的套餐,那么菜单的生成就可以使用建造者模式来进行

二、使用场景

基础组件不变,组合逻辑多变的场景。

如:套餐搭配

三、模型分析

菜单:类,把不同的对象组装起来,形成不同的套餐,应对不同的客户需求(套餐列表)

套餐属性:接口,定义套餐具体特征(套餐名字,包装方式,价格等)

套餐组成:抽象类,实现了套餐公有的属性方法(汉堡、饮料等广泛的内容)

套餐具体内容:类,具体的套餐组成(鸡腿汉堡,可乐等具体的内容)

包装:接口(定义包装的方法)

包装类型:类,实现包装接口(具体的包装方式)

四、代码分析

套餐属性

/**
 * 套餐属性接口
 */
public interface Item {
    public String name();

    public Packing packing();

    public float price();
}

包装

/**
 * 包装接口,定义了包装产品的方法
 */
public interface Packing {
    public String pack();
}

套餐组成

/**
 * 汉堡抽象类(继承了公有的方法)
 */
public abstract class Burger implements Item {

    @Override
    public Packing packing() {
        return new Wrapper();
    }

    @Override
    public abstract float price();
}
/**
 * 冷饮抽象类(继承了公有的方法)
 */
public abstract class ColdDrink implements Item {

    @Override
    public Packing packing() {
        return new Bottle();
    }

    @Override
    public abstract float price();
}

套餐具体内容

/**
 * 鸡肉汉堡类,汉堡类的具体实现
 */
public class ChickenBurger extends Burger {

    @Override
    public float price() {
        return 50.5f;
    }

    @Override
    public String name() {
        return "Chicken Burger";
    }
}
/**
 * 素汉堡类,汉堡类的具体实现
 */
public class VegBurger extends Burger {

    @Override
    public float price() {
        return 25.0f;
    }

    @Override
    public String name() {
        return "Veg Burger";
    }
}
/**
 * 可口可乐类,冷饮类的具体实现
 */
public class Coke extends ColdDrink {

    @Override
    public float price() {
        return 30.0f;
    }

    @Override
    public String name() {
        return "Coke";
    }
}
/**
 * 百事可乐类,冷饮类的具体实现
 */
public class Pepsi extends ColdDrink {

    @Override
    public float price() {
        return 35.0f;
    }

    @Override
    public String name() {
        return "Pepsi";
    }
}

包装类型

/**
 * 瓶子包装
 */
public class Bottle implements Packing {
    @Override
    public String pack() {
        return "Bottle";
    }
}
/**
 * 纸盒包装
 */
public class Wrapper implements Packing {
    @Override
    public String pack() {
        return "Wrapper";
    }
}

套餐

/**
 * 套餐类
 */
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 showItems() {
        for (Item item : items) {
            System.out.print("Item : " + item.name());
            System.out.print(", Packing : " + item.packing().pack());
            System.out.println(", Price : " + item.price());
        }
    }
}

套餐生成器(菜单)

/**
 * 套餐生成类(菜单)
 */
public class MealBuilder {

    /**
     * 素食套餐
     *
     * @return
     */
    public Meal prepareVegMeal() {
        Meal meal = new Meal();
        meal.addItem(new VegBurger());
        meal.addItem(new Coke());
        return meal;
    }

    /**
     * 肉食套餐
     *
     * @return
     */
    public Meal prepareNonVegMeal() {
        Meal meal = new Meal();
        meal.addItem(new ChickenBurger());
        meal.addItem(new Pepsi());
        return meal;
    }
}

 

 

创建型设计模式(三)建造者模式

标签:vat   使用场景   end   item   items   ring   ott   bsp   eve   

原文地址:https://www.cnblogs.com/riches/p/11208655.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!