模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。开闭原则是指一个软件实体应该对扩展开放,对修改关闭。也就是说软件实体必须是在不被修改的情况下被扩展。模板方法模式意图是由抽象父类控制顶级逻辑,并把基本操作的实现推迟到子类去实现,这是通过继承的手段来达到对象的复用,同时也遵守了开闭原则!
我们结合上面的定义解释一下该图。
- AbstractClass便相当于上述作为抽象类的父类,ConcreteClass便是具体的实现子类。具体的应用中,可能存在一到多个实现子类。
- AbstractClass定义了一个public的templateMethod()模板方法以及作为步骤的method1()与method2()方法。
- AbstractClass#templateMethod()方法体调用method1()与method2()方法
public void templateMethod() {
...
this.method()1;
...
this.method()2;
...
}
- method1()与method2()方法为受保护的抽象方法(protected abstract)。实现子类ConcreteClass需要重载该方法。
Template Method模式的应用场景:
Template Method模式一般应用在具有以下条件的应用中:
- 具有统一的操作步骤或操作过程
- 具有不同的操作细节
- 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同