设计模式-模板模式

1、概述

模板模式是一种基于继承的设计模式,它定义了一个算法的骨架,将某些步骤推迟到子类中实现

在模板模式中,有两种角色:

抽象类(Abstract Class): 定义了算法的框架,包括一个或多个方法,其中的某些方法由子类实现。
具体类(Concrete Class): 实现了抽象类中的具体方法,完成算法的各个步骤。

2、优缺点

优点

代码复用: 模板模式通过将通用步骤放在抽象类中,避免了代码的重复实现,提高了代码的可维护性和可复用性。
一致性: 定义了算法的骨架,确保所有子类按照相同的模板执行算法,保持了一致性。
灵活性: 具体步骤延迟到子类实现,使得子类可以灵活地重新定义特定步骤的实现。

缺点

过度抽象: 如果抽象类中的算法骨架过于复杂,可能导致子类实现时需要重写的方法过多,增加了子类的复杂性。
不适用于所有情况: 模板模式可能不适用于所有算法,特别是那些具有不同执行顺序的算法。

3、实现方式



public class Test {
    public static void main(String[] args) {
        BeverageTemplate coffee = new Coffee();
        coffee.prepareBeverage();

        BeverageTemplate tea = new Tea();
        tea.prepareBeverage();
    }
}



public abstract class BeverageTemplate {

    // 准备饮料
    final void prepareBeverage() {
        // 准备开水
        boilWater();
        // 煮
        brew();
        // 倒进杯子
        pourInCup();
        // 添加调味品
        addCondiments();
    }

    abstract void brew();

    abstract void addCondiments();

    void boilWater() {
        System.out.println("Boiling water");
    }

    void pourInCup() {
        System.out.println("Pouring into cup");
    }
}

class Coffee extends BeverageTemplate {

    @Override
    void brew() {
        System.out.println("Brewing coffee grounds");
    }

    @Override
    void addCondiments() {
        System.out.println("Adding sugar and milk");
    }
}

class Tea extends BeverageTemplate {

    @Override
    void brew() {
        System.out.println("Steeping the tea");
    }

    @Override
    void addCondiments() {
        System.out.println("Adding lemon");
    }
}

4、应用场景

算法框架固定,但具体步骤可能有变化

代码复用: 当多个类有相似的行为,但其中一些细节不同,可以将这些共同的行为放在一个抽象类的模板方法中,从而避免代码的重复。

框架设计: 在框架设计中,模板模式经常用于定义框架的骨架和流程。框架提供一个可扩展的基础结构,而具体的实现细节由框架的用户通过继承和实现抽象方法来完成。

生命周期管理: 在对象的生命周期管理中,例如资源的打开和关闭、初始化和清理等过程,模板模式可以确保这些过程按照一定的顺序执行,提高了系统的稳定性。

GUI应用中的事件处理: 在图形用户界面(GUI)应用程序中,事件处理往往遵循一定的模式,例如用户点击按钮后的一系列操作。模板模式可以用于定义事件处理的框架,具体的事件处理则由子类完成。

数据库操作: 在数据库操作中,诸如打开数据库连接、执行SQL语句、关闭连接等过程具有相似的结构。通过模板模式,可以将这些步骤放在抽象类中,而具体的数据库操作由子类完成。

游戏开发中的角色行为: 在游戏开发中,不同角色可能有相似的行为,例如攻击、防御、移动等。使用模板模式可以将这些行为的框架放在抽象类中,而具体的实现由具体角色类完成。

This entry was posted in 应用, 设计模式. Bookmark the permalink.