设计模式-模板方法模式(Template Method Pattern)
2.1 定义
定义一个操作中算法的框架,将一些步骤延迟到子类中去操作,使得子类可以不改变结构就可以改变一些特定的步骤.
模板方法模式很简单.就只是使用了一个继承(extends),其中abstractClass 叫做抽象模板.
它的方法分为两类:
- 基本方法
具体操作,在子类进行操作由父类进行调用
- 模板方法
由一个或多个方法组成,也就是框架,完成对基本方法的调度
public abstract class AbstractClass { //基本方法 protected void doSomething() { } //基本方法 protected void doAnything() { } //模板方法 public void templateMethod(){ doSomething(); doAnything(); } }
测试:
1 public class TestClass extends AbstractClass { 2 3 // 基本方法 4 protected void doSomething() { 5 System.out.println("基本方法实现 1"); 6 } 7 8 // 基本方法 9 protected void doAnything() { 10 System.out.println("基本方法实现 2"); 11 } 12 13 public static void main(String[] args) { 14 TestClass test = new TestClass(); 15 test.templateMethod(); 16 } 17 }
2.2 模板方式的应用
优点:
封装不变部分,拓展可变部分;
提取公共代码,易于维护
行为由父类控制,子类只负责实现
缺点:
最主要就是阅读难度的问题 容易让新手懵圈
使用场景:
多个子类有共有方法时,并且逻辑基本相同
重要,复杂的算法,可以把核心算法设计成模板方法,周边相关细节由子类完成
重构时,模板方法肯定是使用最多的方法,把相同的方法抽取到父类,在使用”钩子函数”约束其行为.
2.3 模板方法的扩展(钩子方法)
比如我们希望可以约束父类中某些方法的执行就可以使用钩子方法
1 public abstract class AbstractClass { 2 3 boolean flag = false; 4 //基本方法 5 protected void doSomething() { 6 7 } 8 //基本方法 9 protected void doAnything() { 10 11 } 12 //模板方法 13 public void templateMethod(){ 14 if (flag) { 15 doSomething(); 16 } 17 doAnything(); 18 } 19 20 //钩子方法 21 protected void setFlag(boolean flag) { 22 this.flag = flag; 23 }
//实现
1 public class TestClass extends AbstractClass { 2 3 // 基本方法 4 protected void doSomething() { 5 System.out.println("基本方法实现 1"); 6 } 7 8 // 基本方法 9 protected void doAnything() { 10 System.out.println("基本方法实现 2"); 11 } 12 13 public static void main(String[] args) { 14 TestClass test = new TestClass(); 15 test.setFlag(true); 16 test.templateMethod(); 17 } 18 }
这样就非常容易的 使用模板了.父类调用子类方法