JAVA 设计模式 模板方法模式

定义


模板方法模式 (Template Method)
定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成。
模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

模板方法模式是所有模式中最为常见的几个模式之一,是基于继承代码复用的基本技术。,没有关联关系。

因此,在模板方法模式的类结构图中,只有继承关系

模板方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。

代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本方法汇总起来的方法叫做模板方法(template method),这个设计模式的名字就是从此而来。

结构


aaarticlea/png;base64,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" alt="" />
图-模板方法模式结构图

AbstractClass : 抽象类,定义并实现一个模板方法。这个模板方法定义了算法的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类去实现。*逻辑也有可能调用一些具体方法。

abstract class AbstractClass {

    public abstract void PrimitiveOperation1();

    public abstract void PrimitiveOperation2();

    

    public void TemplateMethod() {

        PrimitiveOperation1();

        PrimitiveOperation2();

    }

}
ConcreteClass : 实现实现父类所定义的一个或多个抽象方法。
class ConcreteClassA extends AbstractClass {

    @Override

    public void PrimitiveOperation1() {

        System.out.println("具体A类方法1");

    }

    @Override

    public void PrimitiveOperation2() {

        System.out.println("具体A类方法2");

    }

}

class ConcreteClassB extends AbstractClass {

    @Override

    public void PrimitiveOperation1() {

        System.out.println("具体B类方法1");

    }

    @Override

    public void PrimitiveOperation2() {

        System.out.println("具体B类方法2");

    }    

}

测试代码

public class TemplateMethodPattern {

    public static void main(String[] args) {

        AbstractClass objA = new ConcreteClassA();

        AbstractClass objB = new ConcreteClassB();    

        objA.TemplateMethod();

        objB.TemplateMethod();

    }

}

要点


模板方法模式中的三类角色

1、具体方法(Concrete Method)

2、抽象方法(Abstract Method)

3、钩子方法(Hook Method)

三类角色的关联

在模板方法模式中,首先父类会定义一个算法的框架,即实现算法所必须的所有方法。

其中,具有共性的代码放在父类的具体方法中。

各个子类特殊性的代码放在子类的具体方法中。但是父类中需要有对应抽象方法声明。

钩子方法可以让子类决定是否对算法的不同点进行挂钩。

总结

使用模板方法模式可以将代码的公共行为提取,以达到复用的目的。

而对于特殊化的行为在子类中实现。父类的模板方法可以控制子类中的具体实现。

子类无需了解整体算法框架,只需实现自己的业务逻辑即可。

实例


模板方法模式应用场景十分广泛。

在《Head First》的模板方法模式章节里列举了一个十分具有代表性的例子。 

现实生活中,茶和咖啡是随处可见的饮料。冲泡一杯茶或冲泡一杯咖啡的过程是怎样的?

我们来整理一下流程。

泡茶:
烧开水 ==> 冲泡茶叶 ==> 倒入杯中 ==> 添加柠檬
泡咖啡:
烧开水 ==> 冲泡咖啡 ==> 倒入杯中 ==> 添加糖和牛奶

由以上处理步骤不难发现,准备这两种饮料的处理过程非常相似。我们可以使用模板类方法去限定制作饮料的算法框架。

其中相同的具有共性的步骤(如烧开水、倒入杯中),直接在抽象类中给出具体实现。

而对于有差异性的步骤,则在各自的具体类中给出实现。

抽象类
abstract class Beverage {

    // 模板方法,决定了算法骨架。相当于TemplateMethod()方法

    public void prepareBeverage() {

        boilWater();

        brew();

        pourInCup();

        if (customWantsCondiments())

        {

            addCondiments();

        }

    }

    

    // 共性操作,直接在抽象类中定义

    public void boilWater() {

        System.out.println("烧开水");

    }

    

    // 共性操作,直接在抽象类中定义

    public void pourInCup() {

        System.out.println("倒入杯中");

    }

    

    // 钩子方法,决定某些算法步骤是否挂钩在算法中

    public boolean customWantsCondiments() {

        return true;

    }

    

    // 特殊操作,在子类中具体实现

    public abstract void brew();

    

    // 特殊操作,在子类中具体实现

    public abstract void addCondiments();

    

}
具体类
class Tea extends Beverage {

    @Override

    public void brew() {

        System.out.println("冲泡茶叶");

    }

    @Override

    public void addCondiments() {

        System.out.println("添加柠檬");

    }

    

}

class Coffee extends Beverage {

    @Override

    public void brew() {

        System.out.println("冲泡咖啡豆");

    }

    @Override

    public void addCondiments() {

        System.out.println("添加糖和牛奶");

    }

    

}
测试代码
public static void main(String[] args) {

        

    System.out.println("============= 准备茶 =============");

    Beverage tea = new Tea();

    tea.prepareBeverage();

    

    System.out.println("============= 准备咖啡 =============");

    Beverage coffee = new Coffee();

    coffee.prepareBeverage();

    

}
运行结果
============= 准备茶 =============

烧开水

冲泡茶叶

倒入杯中

添加柠檬

============= 准备咖啡 =============

烧开水

冲泡咖啡豆

倒入杯中

添加糖和牛奶
推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》

《HeadFirst设计模式》

上一篇:Java基础-运算符(03)


下一篇:C#设计模式-模板方法模式