模板方法模式的英文:Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method let subclasses redefine certain steps of an algorithm without changing the algorithm`s structure. 意思是:定义一个操作中的算法的框架,而将一些步骤延迟到子类中去。使得子类不改变一个算法结构的情况下即可重新定义该算法的某些特定的步骤。
模板方法模式的两个角色:
抽象模板角色(Abstract Template):该角色定义定义了一个或多个抽象操作,以便让子类实现,这些抽象操作是基本操作,还需要定义一个或几个模板方法,一般是具体的方法,既是定义了一个框架。
具体模板角色(Concrete Template):实现抽象模板中定义的一个或多个抽象方法,每个抽象模板都可以有多个具体模板与之对应,而每个具体模板角色都可以给出这些抽象方法的不同实现。
模板方法模式的类图:
各类对应的实现代码:
抽象模板类:
package com.zz.template;
/**
* 抽象模板
* Copyright 2015年5月15日
* created by txxs
* all right reserved
*/
public abstract class AbstractClass {
//基本方法
protected abstract void operation();
//模板方法
public void templateMethod(){
//调用基本方法完成相关的逻辑
this.operation();
}
}
具体模板1:
package com.zz.template;
/**
* 具体模板角色1
* Copyright 2015年5月15日
* created by txxs
* all right reserved
*/
public class ConcreteClass1 extends AbstractClass {
//实现基本的方法
@Override
protected void operation() {
//业务逻辑处理
}
}
具体模板2:
package com.zz.template;
/**
* 具体模板类2
* Copyright 2015年5月15日
* created by txxs
* all right reserved
*/
public class ConcreteClass2 extends AbstractClass {
//实现基本业务方法
@Override
protected void operation() {
//业务逻辑处理
}
}
客户端:
package com.zz.template;
/**
* 测试类
* Copyright 2015年5月15日
* created by txxs
* all right reserved
*/
public class Client {
public static void main(String[] args) {
AbstractClass class1 = new ConcreteClass1();
AbstractClass class2 = new ConcreteClass2();
//调用模板方法
class1.templateMethod();
class2.templateMethod();
}
}
模板方法模式的优点:
1、封装不变部分,拓展可变部分。不变部分可以封装到父类实现,可变部分可以通过继承进行扩展
2、提取公共代码,有利于维护。将公共代码放在父类中,维护时只需要修改父类代码即可。
3、行为由父类控制,子类实现。模板方法模式中的基本方法是有子类实现的,因此子类可以通过扩展增加相应的功能,符合开闭原则。
模板方法使用的场景:
1、多个子类有公共的方法, 并且逻辑基本相同时。
2、可以把重要的、复杂的、核心的算法设计为模板方法,其细节由各个子类实现。
3、重构时可以把相同的代码提取到父类中。