如果把编程语言比喻成菜刀,需要处理数据是各种菜,那么菜刀就是相对灵活的,它能切花,切片,切块,......

image

那么模版模式,可以类比下面的玩意,他们只能切成固定形状:
image

image

What is Template

模板模式(Template Pattern)它定义了一个操作中的算法骨架,将一些步骤推迟到子类中实现。模板模式使得子类可以在不改变算法结构的情况下,重新定义算法中的特定步骤。

它提供了一种灵活的方式,允许子类定制算法的特定部分,同时保持整体的一致性。

Compare between Template and Builder

模板模式适用于具有相似算法结构但具体步骤有所不同的场景。它提供了一种灵活的方式,允许子类定制算法的特定部分,同时保持整体的一致性。

建造者模式适用于创建对象的构建过程比较复杂,需要一步一步地进行,并且需要创建不同表示的情况。

Key Elements

  • 抽象类(Abstract Class)
    抽象类定义了算法的骨架,包含了一个或多个抽象方法或钩子(hook)方法,这些方法将在具体子类中实现。抽象类还可以包含具体方法来定义算法的通用步骤,这些步骤可以被子类直接使用或覆盖。
  • 具体类(Concrete Class)
    具体类是抽象类的子类,它实现了由抽象类定义的抽象方法或钩子方法,并为算法中的特定步骤提供了具体的实现。

Simple Example

当你使用咖啡机制作咖啡时,可以使用模板模式来定义制作咖啡的算法骨架,同时允许子类来定制特定步骤的实现。

// 模板类 - 制作咖啡的算法骨架
public abstract class CoffeeMaker {
    public void makeCoffee() {
        boilWater();
        brewCoffee();
        pourInCup();
        addMilkAndSugar();
    }
    
    public void boilWater() {
        System.out.println("Boiling water");
    }
    
    // 抽象方法,由子类实现
    public abstract void brewCoffee();
    
    public void pourInCup() {
        System.out.println("Pouring coffee into cup");
    }
    
    // 钩子方法,子类可以选择性实现
    public void addMilkAndSugar() {
        // 默认不加牛奶和糖
    }
}

// 具体类 - 制作黑咖啡
public class BlackCoffeeMaker extends CoffeeMaker {
    @Override
    public void brewCoffee() {
        System.out.println("Brewing black coffee");
    }
}

// 具体类 - 制作拿铁咖啡
public class LatteCoffeeMaker extends CoffeeMaker {
    @Override
    public void brewCoffee() {
        System.out.println("Brewing espresso");
    }
    
    @Override
    public void addMilkAndSugar() {
        System.out.println("Adding milk and sugar");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        CoffeeMaker blackCoffeeMaker = new BlackCoffeeMaker();
        blackCoffeeMaker.makeCoffee();
        
        System.out.println("--------------------");
        
        CoffeeMaker latteCoffeeMaker = new LatteCoffeeMaker();
        latteCoffeeMaker.makeCoffee();
    }
}

在上述示例中,CoffeeMaker 是一个抽象类,定义了制作咖啡的算法骨架。它包含了一系列的步骤:

  1. 烧水
  2. 冲泡咖啡
  3. 倒入杯子中
  4. 加牛奶和糖(可选)。

其中:

  • brewCoffee() 是一个抽象方法,由具体子类实现。
  • addMilkAndSugar() 是一个钩子方法,具体子类可以选择性地覆盖该方法。
  • BlackCoffeeMaker 是一个具体子类,实现了 brewCoffee() 方法,制作黑咖啡时只冲泡咖啡,不加牛奶和糖。
  • LatteCoffeeMaker 是另一个具体子类,实现了 brewCoffee() 方法和 addMilkAndSugar() 方法,制作拿铁咖啡时先冲泡浓缩咖啡,然后加入牛奶和糖。
  • Client 在客户端代码中,我们创建了一个黑咖啡机和一个拿铁咖啡机,并调用它们的 makeCoffee() 方法来制作咖啡。由于模板模式的存在,制作咖啡的算法骨架是固定的,但具体的咖啡种类和加料可以由子类来定制。
posted on   Mysticbinary  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)



点击右上角即可分享
微信分享提示