模板方法模式
模板方法模式:在一个方法中定义一个算法的骨架,而将一些实现步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
要点:
1. 模板方法中的非final方法(默认实现或不做事的方法)称为“钩子”。
2. 钩子可以简化子类的实现。
3. 钩子可以让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤做出反应。
4. primitiveMethod的命名最好加上do前缀。
5. 工厂模式为模板方法模式的特例。
6. 除了可以灵活应对子步骤的变化外,“不用调用我,让我来调用你”的反向控制结构是Template Method的典型应用。
7.
模板方法是代码复用的一项基本的技术,在类库中尤其重要。,它遵循“抽象类应当拥有尽可能多的行为,应当拥有尽可能少的数据”的重构原则。
实现:
AbstractClass:
1. 定义并实现了一个模板方法,定义了一个算法的骨架。
2. 定义抽象的primitiveMethod,具体的子类将实现它们以实现模板骨架的各个算法步骤。
abstract public class AbstractClass { public void TemplateMethod() { primitiveMethod1(); primitiveMethod2(); doOperation3(); } protected abstract void primitiveMethod1(); protected abstract void primitiveMethod2(); private final void doOperation3() { // do something } }
ConcreteClass:
1. 实现primitiveMethod以完成算法中与特定子类相关的步骤。
public class ConcreteClass extends AbstractClass { public void primitiveMethod1() { // write your code here System.out.println("primitiveMethod1();"); } public void primitiveMethod2() { // write your code here System.out.println("primitiveMethod2();"); } }
模板方法模式中的方法:
模板方法:定义在AbstractClass中,形成算法的骨架
基本方法:
1. Abstract Method:由子类具体实现,完成具体的算法步骤。
2. Concrete Method:抽象类实现的final方法,子类不能override。
3. Hook Method:提供缺省的实现,子类可以在必要时进行扩展,钩子简化了子类的实现,它可以让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤做出反应
适用性:
1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例 子。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3. 控制子类扩展。模板方法只在特定点调用Hook操作,这样就只允许在这些点进行扩展。