模板方法模式
定义:定义一个操作中的算法框架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重新定义该算法的某些特定步骤,它是一种行为模式
优点:
1,它封装了不变部分,扩展可变部分,把认为是不变的算法封装到父类中实现,把可变算法由子类继承实现,便于子类据徐扩展。
2,它在父类中提取了公共的部分代码,便于复用
3,部分方法是由子类实现的,因此子类可以通过扩展方式增加想用的功能,符合开闭原则
缺点:
1,对于每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加复杂
2,父类中的抽象方法由子类实现,子类执行结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码的阅读难度
模式的结构:
1,抽象类:负责给出一个算法的轮廓和骨架。它由一个模板方法额若干个基本方法构成。这些方法定义如下:
1,模板方法:定义了算法骨架,按某种顺序调用其包含的基本方法
2,基本方法:整个算法 中的一个基本步骤
1,抽象方法,2,具体方法,3,钩子方法:在抽象类中已经实现,用于判断的逻辑方法和用于子类重写的空方法两种
2,具体子类:实现抽象类中的抽象方法和钩子方法,他们是一个顶级逻辑的一个组成步骤
代码如下:
package templateMethod; public class HookTemplateMethod { public static void main(String[] args) { HookAbstractClass tm=new HookConcreteClass(); tm.TemplateMethod(); } } //含钩子方法的抽象类 abstract class HookAbstractClass { public void TemplateMethod() //模板方法 { abstractMethod1(); HookMethod1(); if(HookMethod2()) { SpecificMethod(); } abstractMethod2(); } public void SpecificMethod() //具体方法 { System.out.println("抽象类中的具体方法被调用..."); } public void HookMethod1(){} //钩子方法1 public boolean HookMethod2() //钩子方法2 { return true; } public abstract void abstractMethod1(); //抽象方法1 public abstract void abstractMethod2(); //抽象方法2 } //含钩子方法的具体子类 class HookConcreteClass extends HookAbstractClass { public void abstractMethod1() { System.out.println("抽象方法1的实现被调用..."); } public void abstractMethod2() { System.out.println("抽象方法2的实现被调用..."); } public void HookMethod1() { System.out.println("钩子方法1被重写..."); } public boolean HookMethod2() { return false; } }