【编程素质】设计模式-模板方法

来源:互联网 发布:阿里云搭建openvpn教程 编辑:程序博客网 时间:2024/05/19 11:37

1,概念

 模板方法模式(Template Pattern):在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

2,场景

 ①在某些类的算法中,用了相同的方法,造成代码的重复。

 ②控制子类扩展,子类必须遵守算法规则。

3,优缺点

 优:

   ①模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

   ② 子类实现算法的某些细节,有助于算法的扩展。

   ③ 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

 缺:

   每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

4,注意:

 ①模板中,抽象方法越多,子类负荷越重,但同时越有弹性。故请合理使用钩子。(见:5,钩子->场景)

 ②使用模板方式时,请遵从OO原则-好莱坞原则。

 ③工厂方法是模板方法中的一种特殊版本。

5,实现:

package template;/** * 咖啡因饮料类 * 抽象类,定义模板,子类继承并实现方法 * @author luo * */public abstract class CaffeineBeverage {/** * 制定模板 * 定义为final,防止子类修改 */final void prepareRecipe(){boilWater();brew();pourInCup();addCondiments();}void boilWater(){System.out.println("boilWater");}/** * 需要子类提供的方法,设置为抽象 */abstract void brew();void pourInCup(){System.out.println("pourInCup");}abstract void addCondiments();}

6,钩子方法

  1)概念:

    钩子是一个被声明在抽象类中的方法,但只有空的或默认的实现。

  2)作用:

    ①钩子的存在,可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定。

    ②作为条件控制,影响抽象类中的算法流程。

    ③让子类能够有机会对模板方法中某些即将发生的步骤做出反应。

  3)场景:

    算法在这部分是可选的,就用钩子。是必须的,就用抽象方法。

  4)实现:

package template;/** * 咖啡因饮料类 * 抽象类,定义模板,子类继承并实现方法 * @author luo * */public abstract class CaffeineBeverageHook {/** * 制定模板 * 定义为final,防止子类修改 */final void prepareRecipe(){boilWater();brew();pourInCup();/** * 钩子方法通过条件控制,影响抽象类中算法流程 */if (customerWantsCondiments()){addCondiments();}}/** * 钩子方法,通过空的缺省实现。 * 子类可以覆盖这个方法,但不一定要这么做。 * @return */boolean customerWantsCondiments(){return true;}void boilWater(){System.out.println("boilWater");}/** * 需要子类提供的方法,设置为抽象 */abstract void brew();void pourInCup(){System.out.println("pourInCup");}abstract void addCondiments();}




2,钩子方法

1)概念:

钩子是一个被声明在抽象类中的方法,但只有空的或默认的实现。

2)作用:钩子的存在,可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定。

3)实现:


注意:

①模板中,抽象方法越多,子类负荷越重,但同时越有弹性。故请合理使用钩子。(见:5,钩子->场景)

②使用模板方式时,请遵从OO原则-好莱坞原则。

    5.1 在某些类的算法中,用了相同的方法,造成代码的重复。

    5.2 控制子类扩展,子类必须遵守算法规则。

    5.2.1 每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。
0 0
原创粉丝点击