一、模板方法的定义
模板方法:在一个方法中定义了一个算法的骨架或者步骤,而将一些步骤延迟到子类中去实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某一些步骤。
二、模板方法的实现
image.png比如银行办理业务的流程:不管客户要办理什么业务,都要经过取号这一步,取完号之后开始办理各种各样的业务,业务办理完毕之后,一般工作人员都会邀请客户进行评价。我们可以把这个过程抽象为三步:
- 取号 不管办理什么业务取号的步骤是一样的
- 办理业务 办理业务这一块应该是有不同的实现方法的
- 评价 不管办理什么业务评价这一步也是一定会邀请的(具体客户做不做看客户心情喽)
如果对应代码,取号和评价基本可以抽象到父类中,作为公共方法,办理业务这一块则各个子类都有各自的实现,再极端点,评价这一步也可以由父类代码有默认实现,如果各个子类有不同的意见可以重写方法覆盖父类实现。
父类方法:
/**
* 模板方法设计模式的抽象类
* @author hollis
*/
public abstract class AbstractBusinessHandeler {
/**
* 模板方法
*/
public final void execute(){
getRowNumber();
handle();
judge();
}
/**
* 取号
* @return
*/
private void getRowNumber(){
System.out.println("rowNumber-00" + RandomUtils.nextInt());
}
/**
* 办理业务
*/
public abstract void handle(); //抽象的办理业务方法,由子类实现
/**
* 评价
*/
public void judge(){
System.out.println("give a praised");
}
}
业务的总执行流程在父类中的execute()
方法中定义好了,取号和评价的方法已经在父类实现了,而且评价的方法时共有的意味着子类可以进行自己的实现,不同的业务类型的子类最大的不同就是handle()
方法的各自实现不同。
子类代码:
public class SaveMoneyHandler extends AbstractBusinessHandeler {
@Override
public void handle() {
System.out.println("save 1000");
}
public static void main(String []args){
SaveMoneyHandler saveMoneyHandler = new SaveMoneyHandler();
saveMoneyHandler.execute();
}
}
在main方法中,子类调用的实际是父类的execute()
方法,所以取号和评价也是执行的父类方法,只有handle()
方法是调用子类自己的方法。这是运用到了Java
继承的原理来实现的
三、总结
1.模板方法模式是一种类的行为型模式,在它的结构图中只有类之间的继承关系,没有对象关联关系。
2.模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一。在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中。
3.在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意。模板方法模式体现了面向对象的诸多重要思想,是一种使用频率较高的模式。
4.钩子是一种方法,它在抽象类中不做事,或者是默认的事情,子类可以选择覆盖它
5.为了防止子类改变模板方法中的算法骨架,一般将模板方法声明为final
6.策略模式和模板方法都是用于封装算法,前者是利用组合和委托模型,而后者则是继承
网友评论