设计模式之禅学习之模板方法设计模式
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();
}
}