在开发中有时会遇到类似的情况,某个方法的实现需要多个步骤,其中有些步骤是固定的,而有些步骤是不固定的,存在可变性。为了提供代码的复用性和灵活性,可以使用模板方法的设计模式。
定义:
模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模板方法模式包含2个角色:
以下用一个银行办理业务的案例来进一步学习模版方法模式。
//抽象类
/**
* 抽象模版类
* 银行业务
*/
public abstract class BankBusiness {
/**
* 取号
*/
public void takeNumber(){
System.out.println("取号排队");
}
/**
* 办理具体业务
*/
public abstract void business();
/**
* 评价
*/
public void rating(){
System.out.println("对银行工作人员进行评分");
}
/**
* 来银行办理业务的模版方法
* 此方法中的final关键字可用可不用,
* 如果此方法要求不能被覆盖重写,就加上,
* 否则可以不加
*/
public final void handle(){
takeNumber();
business();
rating();
}
}
//具体子类
/**
* 存款的业务
*/
public class DepositBankBusiness extends BankBusiness{
@Override
public void business() {
System.out.println("办理存款业务");
}
}
/**
* 转账的业务
*/
public class TransferBankBusiness extends BankBusiness{
@Override
public void business() {
System.out.println("办理转账业务");
}
}
/**
* 取款的业务
*/
public class WithdrawalBankBusiness extends BankBusiness{
@Override
public void business() {
System.out.println("办理取款业务");
}
}
//客户端
public class Client {
public static void main(String[] args) {
/**
* 案例需求描述:
* 在银行办理业务一般包含几个基本步骤,首先需要取号排队,然后办理具体业务,最后需要对银行工作人员进行评分。
* 无论具体业务是取款,存款,转账,其基本流程都一样。
* 现使用模版方法模式模拟银行业务办理流程。
*/
//定义银行业务对象
BankBusiness bankBusiness1;
BankBusiness bankBusiness2;
//这里可以根据其他参数来动态实例化对应的具体功能类
bankBusiness1 = new DepositBankBusiness();
bankBusiness2 = new WithdrawalBankBusiness();
//办理银行业务,这里不会因为上面的new出来的类不同而改代码。
bankBusiness1.handle();
bankBusiness2.handle();
}
}
【参考文献】:
本文是根据刘伟的《Java设计模式》一书的学习笔记,仅供学习用途,勿做其他用途,请尊重知识产权。
【本文代码仓库】:https://gitee.com/xiongbomy/java-design-pattern.git