• 什么是模板设计模式?
  • 发布于 2个月前
  • 408 热度
    0 评论
如图这是一个模板,一般是把固定不变的内容就设计到这个模板里面

我发现项目开发中模板模式是最高频也是相对其他模式最简单的,什么统一的异常处理,统一的日志处理,统一的验证(比如合法数据鉴权),等这种重复的样板代码,都可以利用这个模式,把凌乱的代码整理清爽,哈哈哈。程序汪公司项目里面RPC接口都用模板模式先把异常、日志、验证都统一处理下(抽象类里面),具体业务子类就干业务逻辑(继承那个有模板模式的抽象类)。下面在通过具体的小demo加深下理解吧。

模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

下面是一个简单的咖啡店制作咖啡的例子,展示了模板模式的应用。在这个例子中,我们有一个抽象的`CoffeeMaker`类,它定义了制作咖啡的基本步骤(模板方法),而具体的咖啡种类(如美式咖啡`Americano`、卡布奇诺`Cappuccino`)则作为子类,根据需要重写某些步骤。

抽象类:CoffeeMaker(模板)
public abstract class CoffeeMaker {
    // 模板方法,定义了制作咖啡的流程
    public final void brewCoffee() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
        System.out.println("Coffee is ready!");
    }

    // 基本方法:烧水
    protected void boilWater() {
        System.out.println("Boiling water");
    }
    // 基本方法:冲泡咖啡,留给子类实现
    protected abstract void brew();

    // 基本方法:倒进杯子
    protected void pourInCup() {
        System.out.println("Pouring into cup");
    }

    // 基本方法:添加调料,子类可以选择是否重写
    protected void addCondiments() {
        System.out.println("Adding default condiments");
    }
    // 钩子方法,子类可以根据需要决定是否添加调料
    protected boolean customerWantsCondiments() {
        return true;
    }
}
具体实现类:Americano(具体模板)
public class Americano extends CoffeeMaker {
    @Override
    protected void brew() {
        System.out.println("Brewing Americano");

    }
    // 堆代码 duidaima.com
    // 美式咖啡默认添加少量调料,但这里我们不重写customerWantsCondiments(),所以使用父类的默认实现

}

```
具体实现类:Cappuccino(具体模板)
public class Cappuccino extends CoffeeMaker {
    @Override
    protected void brew() {
        System.out.println("Brewing Cappuccino");
    }
    @Override
    protected void addCondiments() {
        System.out.println("Adding milk and chocolate");

    }
    // 可以选择重写customerWantsCondiments()来改变默认行为,但这里我们保持默认

}

```
客户端代码
public class CoffeeShop {
    public static void main(String[] args) {
        CoffeeMaker coffeeMaker = new Americano();
        coffeeMaker.brewCoffee();
        System.out.println("\n--- Making another coffee ---");
        coffeeMaker = new Cappuccino();
        coffeeMaker.brewCoffee();

    }
}
在这个例子中,`CoffeeMaker`类定义了制作咖啡的一系列步骤,其中`brew()`方法是抽象的,必须由子类实现,而`addCondiments()`方法虽然给出了默认实现,但也允许子类重写以适应不同种类咖啡的需求。这样,通过模板方法模式,我们既能保持咖啡制作流程的一致性,又能够灵活地制作出不同类型的咖啡。
用户评论