9.模板方法模式(行为型)-灵析社区

菜鸟码转

九、 模版方法模式(行为型)

模板模式是一种行为型设计模式,它定义了一个算法的骨架,并允许子类重写特定步骤的实现方式。模板模式将算法的通用部分放在一个抽象父类中,而将不同的实现细节留给具体的子类去实现。当我们需要在多个类之间共享某些相同的行为时,可以考虑使用模板方法模式。

模板模式常常被用来处理算法的变化和复杂性,尤其是当算法需要多个步骤、每个步骤的实现方式不同、以及需要在运行时动态决定算法的具体实现时。通过使用模板模式,我们可以避免代码重复,并且为子类提供一个清晰的框架,以便于更好地组织代码逻辑。

模板模式通常由两部分组成:抽象父类和具体子类。抽象父类包含了算法的高层次结构,而具体子类则负责实现算法的具体步骤。通常情况下,抽象父类会定义算法的骨架,也就是算法所需的各个步骤以及它们之间的关系。具体子类则会实现这些步骤的具体实现方式。

模板方法模式的应用场景

以下是一些模板方法模式的应用场景:

  • 数据库操作:在进行数据库操作时,我们可能需要执行一系列相同的步骤,例如连接数据库、执行 SQL 查询、处理结果等。这些步骤可以抽象成一个模板方法,而每个具体的数据库操作可以通过继承该模板方法并重写其中的某些步骤来实现;
  • 游戏开发:在游戏开发中,我们可能需要编写一些游戏关卡和任务,这些关卡和任务都有一些通用的流程,例如初始化、开始、结束等。这些流程可以抽象成一个模板方法,而每个具体的游戏关卡和任务可以通过继承该模板方法并重写其中的某些步骤来实现;
  • 软件框架:在软件框架开发中,我们可能需要为用户提供一些基础功能,例如日志记录、异常处理等。这些功能可以抽象成一个模板方法,而每个具体的应用程序可以通过继承该模板方法并重写其中的某些步骤来实现。

示例代码

以下是一个简单的 Java 示例代码,演示了如何使用模板方法模式来实现一个冲饮料的流程:

  • 抽象类:定义了算法的骨架,包含若干抽象方法和具体方法。抽象类中的具体方法可以调用抽象方法,但不能被子类重写;
package cn.leetcode;

public abstract class Beverage {

    // 模板方法,定义了制作饮料的流程
    public final void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 基本方法 1:烧水
    private void boilWater() {
        System.out.println("烧水");
    }

    // 基本方法 2:冲泡
    abstract void brew();

    // 基本方法 3:倒入杯子
    private void pourInCup() {
        System.out.println("倒入杯子");
    }

    // 基本方法 4:添加调料
    abstract void addCondiments();

}
  • 具体类(Concrete Class):实现了抽象类中定义的抽象方法,完成算法中的具体步骤。


package cn.leetcode;

public class Coffee extends Beverage {

    // 实现基本方法 2:冲泡咖啡
    @Override
    void brew() {
        System.out.println("冲泡咖啡");
    }

    // 实现基本方法 4:添加糖和牛奶
    @Override
    void addCondiments() {
        System.out.println("添加糖和牛奶");
    }

}
package cn.leetcode;

public class Tea extends Beverage {

    // 实现基本方法 2:冲泡茶叶
    @Override
    void brew() {
        System.out.println("冲泡茶叶");
    }

    // 实现基本方法 4:添加蜂蜜和柠檬
    @Override
    void addCondiments() {
        System.out.println("添加蜂蜜和柠檬");
    }

}
  • 客户端:
package cn.leetcode;

public class Client {

    public static void main(String[] args) {
        Coffee coffee = new Coffee();
        Tea tea = new Tea();

        System.out.println("制作咖啡");
        coffee.prepareBeverage();

        System.out.println("泡茶");
        tea.prepareBeverage();
    }

}

输出:

制作咖啡
烧水
冲泡咖啡
倒入杯子
添加糖和牛奶
泡茶
烧水
冲泡茶叶
倒入杯子
添加蜂蜜和柠檬

这个示例中,我们定义了一个抽象基类 Beverage,其中包含了一个模板方法 prepareBeverage() 和四个基本方法 boilWater()、brew()、pourInCup() 和 addCondiments()。具体的饮料子类(如 Coffee 和 Tea)继承自 Beverage 并实现其中的基本方法。

在 TestTemplateMethod 类中,我们创建了 Coffee 和 Tea 的实例,并调用它们的 prepareBeverage() 方法,即开始制作饮料并输出相应的制作流程。

总结

模板方法是一种行为型设计模式,它定义了一个算法的骨架,将某些步骤延迟到子类中实现。模板方法能够提高代码复用性、可维护性、可扩展性,同时符合开闭原则,使得系统更加灵活和可扩展。模板方法的核心思想是将算法的通用部分封装在抽象类中,而将算法的特定部分延迟到子类中实现,从而实现算法的扩展和变化。

阅读量:2013

点赞量:0

收藏量:0