在平时开发中,你是否遇到过这种情况:确定了业务逻辑的关键步骤及其执行顺序,但是某些步骤的具体实现还未知,或者某些步骤的实现与具体的环境有关。
比如,我们去银行办理业务的时候,一般都是按照这个步骤来的:取号、排队等候、办理业务、评价。这是一个固定的流程,但是其中办理业务这个步骤是因人而异的,他们可能办理存款业务、转账业务或者是贷款业务。还有报销的过程,在医院挂号看病等这些例子,都是有一套固定的流程,但是在某些步骤上有不同的实现。
就像我们平常使用的简历模板,论文模板,在模板里面写不同的内容。
你看,这不就是我们设计模式中的模板方法模式嘛?
模板方法模式
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
注:这里的“算法”,我们可以理解为广义上的“业务逻辑”,并不特指数据结构和算法中的“算法”。这里的算法框架就是“模板”,包含算法框架的方法就是“模板方法”。
- AbstractClass:抽象类。用来定义算法框架和抽象操作,具体的子类通过重定义这些抽象操作来实现一个算法的各个步骤。在这个类里面,还可以提供算法中通用的实现。
- ConcreteClass:具体实现类。用来实现算法框架中的某些步骤,完成与特定子类相关的功能。
走,我们去银行看看。
public abstract class AbstractClass {
// 模板方法(不可以被覆盖,所以是final)
public final void TemplateMethod() {
TakeANumber(); // 取号
QueueUp(); // 排队
Business(); // 办理业务