模板方法模型
-
模板方法模式和策略模式的区别:
- 模板方法模式更注重流程,而策略模式更注重算法间的替换,不影响客户端的使用。
- 模板方法就像链表,线上有许多的结点,结点内容可以改变。入口只有一个(也就是头节点)。
- 模板方法是局部替换,而策略模式是整体替换。
-
定义:
模板方法模式,定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
在不改变模板结构的前提下在子类中重新定义模板中的内容。将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
-
使用场景:
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
- 控制子类的扩展。
-
UML:
- AbstractClass:实现一个模板方法,定义了算法的骨架,具体子类将重定义method方法以实现一个算法的步骤。AbstractClass其实就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体的方法。它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
- ConcreteClass:实现method方法以完成算法与特定子类相关的步骤。ConcreteClass实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。
-
优点:
- 提高了代码的复用性,将相同的代码放到了父类当中。
- 提高了代码的扩展性,继承父类重写抽象方法,可以拓展更新。
- 实现了控制反转,通过父类来调用子类,同时也符合了开闭原则。
-
缺点:
- 引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。
- 抽象类负责声明最抽象、最一般的事物属性和方法,实现类负责完成具体的事务属性和方法,但是模板方式正好相反,子类执行的结果影响了父类的结果,会增加代码阅读的难度。
-
样例:
public abstract class AbstractClass { public void operation(){ methodA() ; methodB() ; } public abstract void methodA() ; public abstract void methodB() ; }
public class ConcreteClassA extends AbstractClass{ @Override public void methodA(){ System.out.println("ConcreteClassA.methodA()") ; } @Override public void methodB(){ System.out.println("ConcreteClassA.methodB()") ; } }
public class ConcreteClassB extends AbstractClass{ @Override public void methodA(){ System.out.println("ConcreteClassB.methodA()") ; } @Override public void methodB(){ System.out.println("ConcreteClassB.methodB()") ; } }
public class client{ public static void main(String[] args){ AbstractClass concreteClassA = new ConcreteClassA() ; concreteClassA.operation() ; AbstractClass concreteClassB = new ConcreteClassB() ; concreteClassB.operation() ; } }