重温设计模式之模板方法模式

模板方法模式  Template Pattern

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

回到小明的披萨店。见建造者模式

经营一段时间后,小明开始思考如何降低人力成本,他意识到,如果能够通过规则保证每个步骤的正确执行,就不需要额外的监督员;而且制作披萨的加芝士和烘焙步骤,两种披萨是一样的,是否可以考虑合并。

小明用程序员的大脑思考了一会,想到了模板方法模式。

UML图:

代码:

public class Pizza {
    private String crust;
    private String ingredients;
    private String sauce;

    public Pizza() {
    }

    public String toString() {
        return crust + ingredients + "披萨";
    }

    public String getCrust() {
        return crust;
    }

    public void setCrust(String crust) {
        this.crust = crust;
    }

    public String getIngredients() {
        return ingredients;
    }

    public void setIngredients(String ingredients) {
        this.ingredients = ingredients;
    }

    public String getSauce() {
        return sauce;
    }

    public void setSauce(String sauce) {
        this.sauce = sauce;
    }
}
public abstract class Builder {

    protected Pizza pizza = new Pizza();

    public abstract void makeCrust();

    public abstract void addIngredients();

    public abstract void addSauce();

    public final void addCheese() {
        System.out.println("加入芝士");
    }

    public final void bake() {
        System.out.println("烘烤");
    }

    public final Pizza build() {
        makeCrust();
        addIngredients();
        addSauce();
        addCheese();
        bake();
        return pizza;
    }
}
public class FruitBuilder extends Builder {
    @Override
    public void makeCrust() {
        pizza.setCrust("芝心");
        System.out.println("制作芝心面饼");
    }

    @Override
    public void addIngredients() {
        pizza.setIngredients("水果");
        System.out.println("加入菠萝");
    }

    @Override
    public void addSauce() {
        pizza.setSauce("番茄酱");
        System.out.println("加入番茄酱");
    }
}
public class SeafoodBuilder extends Builder {

    @Override
    public void makeCrust() {
        pizza.setCrust("经典手拍");
        System.out.println("制作经典手拍面饼");
    }

    @Override
    public void addIngredients() {
        pizza.setIngredients("海鲜");
        System.out.println("加入海鲜馅料");
    }

    @Override
    public void addSauce() {
        pizza.setSauce("香辣酱");
        System.out.println("加入香辣酱");
    }
}

客户端:

public class Client {

    public static void main(String[] args) {

        Builder fruitBuilder = new FruitBuilder();
        Pizza fruitPizza = fruitBuilder.build();
        System.out.println(fruitPizza);

        Builder seafoodBuilder = new SeafoodBuilder();
        Pizza seafoodPizza = seafoodBuilder.build();
        System.out.println(seafoodPizza);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值