一、介绍
- 从生活角度理解,我们都在银行办理过多种业务,不管办理哪种业务,银行都有一个固定的流程,比如都需要先排队,然后办理业务,最后针对银行工作反馈评分等。在这个过程中,排队和反馈评分都是固定的套路,不会随着业务的不同而变化,但是办理的业务是不确定的,有可能是存钱业务,有可能是理财业务。因此,可以将其抽取一个模板,将排队操作和反馈评分操作统一并固定化,具体业务办理交给客户和柜员具体去处理。
- 在模板模式中,一个抽象类公开定义了执行它的方法的方式或模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
二、案例
- 抽取模板
/**
* 银行业务办理模板
*
* @author zhangxs
**/
public abstract class AbstractBankTemplate {
public void takeNumber(){
System.out.println("取号排队");
}
/**
* 办理具体的业务,不确定的易变的部分抽象出来由子类实现
*/
public abstract void transact();
public void evaluate(){
System.out.println("反馈评分");
}
public void process(){
this.takeNumber();
this.transact();
this.evaluate();
}
}
- 存钱业务
/**
* 存钱业务
*
* @author zhangxs
**/
public class DrawMoney extends AbstractBankTemplate {
@Override
public void transact() {
System.out.println("我现在需要存钱!!!");
}
}
- 理财业务
/**
* 理财业务
*
* @author zhangxs
**/
public class ManageMoney extends AbstractBankTemplate {
@Override
public void transact() {
System.out.println("我现在有2000千万,我想做理财!!!");
}
}
三、测试
/**
* 测试使用
*
* @author zhangxs
**/
public class TestTemplateMethod {
public static void main(String[] args) {
AbstractBankTemplate drawMoney = new DrawMoney();
drawMoney.process();
AbstractBankTemplate manageMoney = new ManageMoney();
manageMoney.process();
}
}
四、总结
1、优点
模板方法模式通过把不变的行为抽象出来,去除子类中的重复代码。子类实现算法或业务的具体细节,有助于算法或业务的扩展。通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合开闭原则。
2、缺点
每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。
3、适用场景
在某些类的算法或业务中,用了相同的方法,造成代码的重复的情况,或者需要控制子类扩展,子类必须遵守算法或业务规则的场景下,可以使用模板方法模式优化代码。