TypechoJoeTheme

IT技术分享

统计

模板方法模式(Template Method)——23种设计模式之行为型模式

2016-04-21
/
0 评论
/
597 阅读
/
正在检测是否收录...
04/21

我们经常会面临许多框架结构上相 似,但是却在细节上稍有不同的代码。另外,程序中有些规则和约束,我们希望不会被违反。

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算 法的结构即可重定义该算法的某些特定步骤。

这是一个很简单的模式,却使用非常广泛。之 所以简单是因为在这个模式中仅仅使用到了继承关系。

一、类图表示

模板方法模式中涉及到AbstractClass(抽象类),ConcreteClass(具体子类)等角色

  • ①、抽象类:定义抽象的原语操作(primitive operation),具体的子类将重定义它们以实现一个算法的各步骤。实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。
  • ②、ConcreteClass(具体子类):实现原语操作以完成算法中与特定子类相关的步骤

java-template-method-model-1

三、代码示例

public abstract class HouseTemplate {

    //模板方法
    public final void buildHouse(){
        buildFoundation();
        buildPillars();
        buildWalls();
        buildWindows();
         System.out.println("House is built.");
    }

    //基本方法—具体方法
    private void buildWindows() {
         System.out.println("Building Glass Windows");
    }

    //基本方法—抽象方法
    public abstract void buildWalls();
    public abstract void buildPillars();

    //基本方法—钩子方法
    private void buildFoundation() {
        System.out.println("Building foundation with cement,iron rods and sand");
    }
}
public class WoodenHouse extends HouseTemplate {

    @Override
    public void buildWalls() {
        System.out.println("Building Wooden Walls");
    }

    @Override
    public void buildPillars() {
        System.out.println("Building Pillars with Wood coating");
    }
}
public class GlassHouse extends HouseTemplate {

    @Override
    public void buildWalls() {
        System.out.println("Building Glass Walls");
    }

    @Override
        public void buildPillars() {
        System.out.println("Building Pillars with glass coating");
    }

}
public class HousingClient {

    public static void main(String[] args) {

        HouseTemplate houseType = new WoodenHouse();

        //使用模板方法
        houseType.buildHouse();
        System.out.println("************");

        houseType = new GlassHouse();

        houseType.buildHouse();
    }

}

三、模式分析

模板方法中涉及到的方法:

  • ①、模板方法:一个模板方法是定义在抽象类中的、把基本操作方法组合在一起形成一个总算法或一个总行为的方法。
  • ②、基本方法:基本方法是实现算法各个步骤的方法,是模板方法的组成部分。
  • ③、基本方法包括:抽象方法(Abstract Method),具体方法(Concrete Method),钩子方法(Hook Method):“挂钩”方法和空方法
  • ④、在模板方法模式中,钩子方法有两类。钩子方法是实现为空的具体方法,子类可以根据 需要覆盖或者继承这些钩子方法。
  • ⑤、如果没有覆盖父类中定义的钩子方法,编译可以通过
  • ⑥、钩子方法与一些具体步骤“挂钩”,以确定在不同条件下执行模板方法的不同步骤。该类钩子方法的返回类型通常是boolean类型,用于对某条件 进行判断,如果条件满足则执行某一步骤,否则不执行,从而可以通过在子类中实现的钩子方法对父类方法的执行进行约束,实现 子类对父类行为的反向控制。

四、优缺点分析

1、优点

  • ①、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  • ②、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • ③、行为由父类控制子类实现。基本方法由子类实现,子类可通过扩展的方式增加相应功能,符合开闭原则。
  • ④、非常成功地实现了变化对系统的影响,使系统的扩展性增强,降低了小变化对系统的影响程度。
  • ⑤、简约而不简单。

五、模式间关系

1、与工厂方法模式的关系

  • ①、Factory Method模式常被模板方法调用

2、与策略模式的关系

  • ①、模板方法使用继承来改变算法的一部分。Strategy使用委托来改变整个算法

五、应用场景

要完成在某一细节层次一致的一个过程或一系列步骤,但其中个别步骤在更细节的层次上有不同的实现。

  • ①、一次性实现一个算法的不变的部分,并将可变 的行为留给子类来实现
  • ②、各子类中公共的行为应被提取出来并集中到一 个公共父类中以避免代码重复--“重分解以一般 化”
  • ③、控制子类扩展。模板方法只在特定点调用 “hook”操作,这样就只允许在这些点进行扩展

六、总结

提供了一个很好的代码复用平台。提供了一种机制,使得约束、规则可一次编码,处处使用

  • ①、如果你只想掌握一种设计模式的话,那一定是模板方法模式,它体现了面向对象的诸多重要思想
  • ②、Template Method模式是非常简单而且几乎是无 处不用,很少有人没有用过它。
  • ③、设计模式中大多都提倡面向接口编程,用组合来 代替继承,但模板方法模式中与之相反应用了继 承。
  • ④、模板模式是比较简单的设计模式之 一,但它是代码复用的一项基本的技术,在类 库中尤其重要。
  • ⑤、模板方法导致一种反向的控制结构。
  • ⑥、“好莱坞原则” :子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑!
  • ⑦、每当定义一个新的子类时,不要按照控制流程 的思路去想,而应按照“责任”的思路去想。 即:应当考虑有哪些操作是必须臵换掉的,以 及哪些操作是不可以臵换掉的。使用模板方法可以使这些责任变得清晰。
  • ⑧、Template Method模式是一种非常基础的设计模式, 在面向对象系统中有着大量的应用。它用最简洁的机制 (虚函数的多态性)为很多应用程序框架提供了灵活的 扩展点,是代码复用方面的基本实现结构。
  • ⑨、在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法,纯虚方法),但一般推荐将它们设臵为protected方法。
  • ⑩、通过模板模式,在需要支持概念上行为相同而每个步骤的实现不同的多个系统时,我们还可以避免冗余的出现。
朗读
赞 · 0
版权属于:

IT技术分享

本文链接:

https://idunso.com/archives/1897/(转载时请注明本文出处及文章链接)