关于设计模式,我们已经介绍了单例模式,接下来认识一下模板方法模式
模板方法模式
1.什么是模板方法模式?
模板方法模式就是定义一个操作中算法的框架,而将一些步骤延迟到子类中来,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
2.模板方法模式非常简单,使用了Java的继承机制,其中AbstractClass叫做抽象模板,他的方法分为两类。
① 基本方法
基本方法也叫基本操作,是由子类实现的方法,并且在模板方法被调用。
② 模板方法
可以有一个或几个,一般是一个具体方法,也就是一个框架。实现对基本方法的调度,完成固定的逻辑。
注意
① 为了防止恶意的操作,一般对模板方法加上final关键字修饰,不允许对该方法重写。
② 根据迪米特法则:抽象模板中的方法尽量设计为protected类型,不需要暴露属性的方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限。
3.模板方法模式实现
我们可以根据银行的业务办理流程
① 取号排队
② 办理业务
③ 进行业务评价
类比模板方法模式,实现业务逻辑,类似于AOP编程。
接下来,我们使用模板方法模式实现具体的逻辑功能:
//抽象父类,只是定义抽象方法
public abstract class AbstractClass {
//模板方法
public void takeNumber() {
System.out.println("取号排队!");
}
//基本方法:实现具体的功能、业务逻辑
protected abstract void doSomething(); //钩子方法:需要使用那个模板就定义在该处
//模板方法
public void evaluate() {
System.out.println("办理完业务进行评价!");
}
public final void templateMethod() {
//调用模板方法,取号排队
this.takeNumber();
//调用基本方法,在子类中实现其功能
this.doSomething(); //钩子方法:需要使用那个模板就定义在该处
//调用模板方法,进行评价
this.evaluate();
}
}
//子类继承抽象父类,重写父类中的抽象方法
public class ConcreteClass01 extends AbstractClass{
@Override
protected void doSomething() {
System.out.println("我要办信用卡!");
}
}
//子类继承抽象父类,重写父类中的抽象方法
public class ConcreteClass02 extends AbstractClass{
@Override
protected void doSomething() {
System.out.println("我有1000万美金,我要存钱!");
}
}
//模板方法模式的测试类
public class TemplateTest {
public static void main(String[] args) {
ConcreteClass01 concreteClass01 = new ConcreteClass01();
ConcreteClass02 concreteClass02 = new ConcreteClass02();
concreteClass01.templateMethod();
System.out.println("**************************************");
concreteClass02.templateMethod();
}
}
实现结果:
4. 模板方法模式的优缺点
优点:
1)封装不变部分,扩展可变部分:把认为不变部分的算法封装到父类实现,可变部分则可以通过继承来实现,很容易扩展。
2)提取公共部分代码,便于维护:上面悍马的例子就是个很好的解释。
3)行为由父类控制,由子类实现。
缺点:
模板方法模式颠倒了我们平常的设计习惯:抽象类负责声明最抽象、最一般的事物属性和方法,实现类实现具体的事物属性和方法。在复杂的项目中可能会带来代码阅读的难度。