模板方法模式是设计模式是类的行为模式,意图定义一个算法的骨架,而将一些不通用的步骤延迟到子类中,模板方法模式使得子类可以不重新定义一个算法的整体框架而改变某些步骤的实现。例如,我们将钱存在银行中,分为定期存储和活期存储,两种存储方式的计算规则类似,但是仅仅是计算方式不同而已,这样我就不需要定义两个类分别计算定期存储和活期存储之后的余额,使用模板方法模式则是将通用的计算过程抽象到一个抽象类,不通用的计算过程通过两个子类分别计算即可,这样也减少了代码量,去除了重复性代码。
一次性实现一个算法的不变部分,将可变的行为留给子类去实现。
各子类中的公共行为应该抽取出来放到一个公共的类中,避免代码的重复。
模板方法模式中包含的角色看起来比较简单,只有两类角色:
1、抽象类(AbstractClass):抽象类中可以包含模板方法、抽象方法、钩子方法,其中模板方法是不需要被实现的,钩子方法是可选择被实现的,抽象方式是需要被实现的。
2、具体类(ConcreteClass):实现抽象类中的抽象方法,完成算法的中特定步骤。
首先定义抽象类,在模板方法中执行具有公共特征的操作。
public abstract class AbstractClass { /*模板方法,不需要子类实现*/ public final void templateMethod(){ System.out.println("---首先执行公共操作---"); System.out.println("---其次执行钩子方法---"); PrimitiveOperation1(); System.out.println("---最后执行抽象方法---"); PrimitiveOperation2(); } /*钩子方法,子类可选择实现*/ public void PrimitiveOperation1(){} /*钩抽象方法,子类需要实现实现*/ public abstract void PrimitiveOperation2(); }
定义具体类1,实现抽象方法PrimitiveOperation2(),同时不重写钩子方法PrimitiveOperation1()
public class ConcreteClass1 extends AbstractClass { @Override public void PrimitiveOperation2() { System.out.println("子类1执行执行抽象方法"); } }
定义具体类2,实现抽象方法PrimitiveOperation2(),同时重写钩子方法PrimitiveOperation1()
public class ConcreteClass2 extends AbstractClass { @Override public void PrimitiveOperation1() { System.out.println("子类2执行钩子方法"); } @Override public void PrimitiveOperation2() { System.out.println("子类2执行抽象方法"); } }
客户端调用
public class Client { public static void main(String[] args) { /*分别用两个类继承抽象类,实现不同的操作,但是公共的部分全都由抽象类来实现*/ AbstractClass concreteClass1=new ConcreteClass1(); concreteClass1.templateMethod(); System.out.println("-----------------------------------"); AbstractClass concreteClass2=new ConcreteClass2(); concreteClass2.templateMethod(); } } /* 运行结果: ---首先执行公共操作--- ---其次执行钩子方法--- ---最后执行抽象方法--- 子类1执行执行抽象方法 ----------------------------------- ---首先执行公共操作--- ---其次执行钩子方法--- 子类2执行钩子方法 ---最后执行抽象方法--- 子类2执行抽象方法*/
模板方法模式,是开发过程中用的比较多的几大设计模式之一,它是基于继承的代码复用技术来实现的,将子类中公共的代替抽取到超类由超类进行统一管理,避免了书写重复的代码同时也方便修改,如果开发完成后算法的整体逻辑需要修改,则只需要修改超类中的代码即可。
原文:https://www.cnblogs.com/rhodesis/p/11349520.html