模板方法设计模式及其扩展
程序员文章站
2022-04-04 14:13:21
...
设计模式之禅学习之模板方法设计模式
1、模板方法设计模式相当简单,就是把相同的方法提取到抽象类中,平时也会经常用到,只是不知道这就是模板方法设计模式罢了
2、模板方法类:
package com.wang.templatePattern; /** * 抽象模板类 * @author HeJW * */ public abstract class AbstractClass { //基本方法 protected abstract void method1(); protected abstract void method2(); protected abstract void method3(); //模板方法 final public void templateMethod(){ //调用基本方法,完成业务逻辑 this.method1(); this.method2(); this.method3(); } }
3、具体的模板,模板可以有多个,一下是一个例子:
package com.wang.templatePattern; /** * 具体模板类1 * @author HeJW * */ public class ConcreteClass1 extends AbstractClass { @Override protected void method1() { System.out.println("1 1"); } @Override protected void method2() { System.out.println("1 2"); } @Override protected void method3() { System.out.println("1 3"); } }
另一个模板:
package com.wang.templatePattern; /** * 具体模板类2 * @author HeJW * */ public class ConcreteClass2 extends AbstractClass { @Override protected void method1() { System.out.println("2 1"); } @Override protected void method2() { System.out.println("2 2"); } @Override protected void method3() { System.out.println("2 3"); } }
4、测试类
package com.wang.templatePattern; public class App { public static void main(String[] args) { AbstractClass class1 = new ConcreteClass1(); class1.templateMethod(); AbstractClass class2 = new ConcreteClass2(); class2.templateMethod(); } }
5、模板方法设计模式的扩展,在抽象模板中定义的基本方法,在具体模板中,不一定都能够用到,还有可能用不用这个基本方法需要客户端决定,这时可以在抽象模板中定义钩子函数:
一个扩展的抽象模板:
package com.wang.templatePattern.develop; /** * 抽象模板类 * @author HeJW * */ public abstract class AbstractClass { //基本方法 protected abstract void method1(); protected abstract void method2(); protected abstract void method3(); //模板方法 final public void templateMethod(){ //调用基本方法,完成业务逻辑 this.method1(); //根据条件判断这个方法执行不执行 if ( this.condition() ) { this.method2(); } this.method3(); } //钩子函数 protected boolean condition() { return true; } }
在类中可以看到,有一个钩子函数,该钩子函数能够决定基本方法是否执行,
以下是一个由客户端决定执不执行基本方法的具体模板类:
package com.wang.templatePattern.develop; /** * 具体模板类1 * @author HeJW * */ public class ConcreteClass1 extends AbstractClass { private boolean condition = true; //判断条件由客户端决定,默认执行 public void setCondition( boolean condition ){ this.condition = condition; } @Override protected boolean condition() { return this.condition; } @Override protected void method1() { System.out.println("1 1"); } @Override protected void method2() { System.out.println("1 2"); } @Override protected void method3() { System.out.println("1 3"); } }
这样就可以在客户端中决定基本方法是否执行了。
一个测试类:
package com.wang.templatePattern.develop; public class App { public static void main(String[] args) { ConcreteClass1 class1 = new ConcreteClass1(); //不执行 class1.setCondition(false); class1.templateMethod(); } }