建造者模式 -- 设计模式

本文深入探讨了建造者模式(BuilderPattern)的概念与应用,通过一个快餐订购系统的实例,展示了如何使用该模式逐步构建复杂对象。文章详细解释了接口、抽象类和具体实现类的作用,以及它们如何协同工作来组装不同类型的餐品。
摘要由CSDN通过智能技术生成

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象, (组装对象)。

思考: 使用接口来完成区别很大的东西来进行向上造型, 然后使用接口视图利用多态来完成具体操作, 在本例中, Meal中的每一份都有一个打包方法, 有的装在杯子里, 有的装在纸盒中

 

package day0316.BuilderPattern;

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

public class BuilderPatternDemo{

    public static void main(String[] args){
        // new order
        Meal meal = new Meal();
        // user click pepsi
        meal.addItem(new Pepsi());
        // user click MFCChickenBurger
        meal.addItem(new MFCChickenBurger());
        // user click vegBurger
        meal.addItem(new VegBurger());
        // packing them
        meal.packing();
        // counting price
        float price = meal.price();

        System.out.println("Your meal's final price is: " + price);
    }
}


class Meal {

    List<Item> items;

    public Meal(){
        items = new ArrayList<>();
    }

    public List<Item> getItems(){
        return items;
    }

    public void addItem(Item item) {
        this.items.add(item);
    }

    public float price() {
        float ret = 0.0f;
        for (Item item : items){
            ret += item.price();
        }
        return ret;
    }


    public void packing() {
        for (Item item : items){
            item.packing();
        }
    }
}

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

abstract class Packing {

    void wrap(Item item){
    }

    void bottle(Item item){
    }
}

class Wrapper extends Packing {

    @Override
    void wrap(Item item){
        System.out.println("wrapping " + item.name());
    }
}

class PlasticWrapper extends Wrapper {

    @Override
    void wrap(Item item){
        System.out.println("use plastic wrapping " + item.name());
    }
}

class Bottle extends Packing {

    @Override
    void bottle(Item item){
        System.out.println("Carefully bottling use a beautiful bottle with pretty pattern " + item.name());
    }
}

abstract class Burger implements Item{

    Wrapper wrapper = new Wrapper();
}

abstract class ColdDrink implements Item{

    Bottle bottle = new Bottle();

}

class Pepsi extends ColdDrink{


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

    @Override
    public Packing packing(){
        bottle.bottle(this);
        return this.bottle;
    }

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


class Coke extends ColdDrink{

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

    @Override
    public Packing packing(){
        bottle.bottle(this);
        return this.bottle;
    }

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

class VegBurger extends Burger {


    @Override
    public String name(){

        return "VegBurger";
    }

    @Override
    public Packing packing(){
        this.wrapper.wrap(this);
        return this.wrapper;
    }

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


class ChickenBurger extends Burger {


    @Override
    public String name(){

        return "ChickenBurger";
    }

    @Override
    public Packing packing(){
        this.wrapper.wrap(this);
        return this.wrapper;
    }

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


class MFCChickenBurger extends Burger {

    {
        this.wrapper = new PlasticWrapper();
    }

    @Override
    public String name(){

        return "MFCChickenBurger";
    }

    @Override
    public Packing packing(){
        this.wrapper.wrap(this);
        return this.wrapper;
    }

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

  

转载于:https://www.cnblogs.com/litran/p/10641135.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值