设计模式 —— 模板方法模式(Template method Pattern)

原创 2016年05月30日 11:20:15

模板方法模式(Template method Pattern)

概念:

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


组成:

模板方法模式

templateMethod(模板方法):定义了某个算法的模板顺序或一组步骤,其中任何步骤都可以是抽象的,由子类来实现。

primitiveOperation1(抽象步骤方法):抽象类中声明,由子类各自实现。

hook(钩子函数):钩子是一种被声明在抽象类中的方法,但只有空的和默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。要不要挂钩由子类自行决定。当我们的子类 “必须” 提供某个方法或步骤的实现时,就使用抽象方法。如果算法的这个部分是可选的,就用钩子。如果是钩子的化,子类可以选择实现这个钩子,但不强制这么做。简单来说 可选的步骤 一般实现为钩子函数。


例子:

咖啡店里的咖啡和茶制作时都有类似的步骤,首先加热水,然后放入茶或咖啡搅拌(冲泡),然后将饮料倒入杯子,最后加调料。这些步骤是固定的,但固定的步骤中冲泡和加调料两者分别是不同的。我们现在通过模板方法模式来实现它。

模板方法模式


抽象模板方法

public abstract class CoffeeShopBeverage {
    //模板方法,制作步骤
    final void prepareRecipe() {
        boidWater();
        brew();
        pourInCup();
        if (isAddCondiments()) {
            addCondiments();
        }
    }

    //冲泡
    abstract void brew();
    //加调料
    abstract void addCondiments();

    //固定步骤
    void boidWater() {
        System.out.println("加热水...");
    }
    void pourInCup() {
        System.out.println("倒入杯中...");
    }

    //钩子函数,来决定是否加调料
    boolean isAddCondiments() {
        return true;
    }
}

咖啡类

public class Coffee extends CoffeeShopBeverage {
    @Override
    void brew() {
        System.out.println("放入咖啡...");
    }

    @Override
    void addCondiments() {
        System.out.println("加奶和糖...");
    }
}

茶类

public class Tea extends CoffeeShopBeverage {
    @Override
    void brew() {
        System.out.println("放入茶叶...");
    }

    @Override
    void addCondiments() {
        System.out.println("加柠檬...");
    }

    //覆盖钩子函数,默认不加柠檬
    @Override
    boolean isAddCondiments() {
        System.out.println("什么也不加...");
        return false;
    }
}

测试类:

public class Drink {
    public static void main(String[] args) {
        Coffee coffee = new Coffee();
        System.out.println("Coffee..");
        coffee.prepareRecipe();

        Tea tea = new Tea();
        System.out.println("\nTea...");
        tea.prepareRecipe();
    }
}

模板方法模式


适用场景:

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • 控制子类扩展。模板方法只在特定点调用“ hook”操作 ,这样就只允许在这些点进行扩展。

优缺点:

优点:

  • 模板方法模式在一个类中形式化地定义算法,而由它的子类实现细节的处理。
  • 模板方法是一种代码复用的基本技术。它们在类库中尤为重要,它们提取了类库中的公共行为。
  • 模板方法模式导致一种反向的控制结构,这种结构有时被称为“好莱坞法则” ,即“别找我们,我们找你”通过一个父类调用其子类的操作(而不是相反的子类调用父类),通过对子类的扩展增加新的行为,符合“开闭原则”。

缺点:

  • 每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,但是更加符合“单一职责原则”,使得类的内聚性得以提高。

补充:好莱坞原则

好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你。

好莱坞原则是用在创建框架或组件上的一种技巧,好让底层组件能够被挂钩进计算中,而且又不会让高层组件依赖底层组件。创建一个有弹性的设计,允许底层结构能够相互操作,而又防止其他类太过依赖它们。


参考:

《Head first 设计模式》

设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

版权声明:free, open, share

(C++实现)——模板方法模式(Template Method Pattern)

概述:      我们最近在开发一个支持多种压缩类型文件的解压缩且制作成pdf的一个应用。对我们的架构来说我们需要支持多种压缩文件类型,但却有固定的操作顺序(先解压缩,在读取里面的文件分析、制作...
  • u011676589
  • u011676589
  • 2013年09月18日 14:21
  • 1064

JAVA设计模式之 模板方法模式【Template Method Pattern】

一、概述 二、适用chuangk
  • l416112167
  • l416112167
  • 2014年11月11日 01:09
  • 2842

模板方法模式(Template Method) - 最易懂的设计模式解析

前言今天我来全面总结一下Android开发中最常用的设计模式 - 模板方法模式。 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析...
  • carson_ho
  • carson_ho
  • 2017年02月07日 15:37
  • 5120

【java设计模式】之 模板方法(Template Method)模式

1. 模板方法的一个实例         这一节主要来学习一下设计模式中的模板方法模式。我们先来看一个例子:假如现在老板让你做一个汽车的模型,要求只要完成基本功能即可,不考虑扩展性,那你会怎么做呢?...
  • eson_15
  • eson_15
  • 2016年05月06日 08:57
  • 4065

设计模式——模板方法模式【Template Method Pattern】

 我先设计个类图:非常简单的实现,你要悍马模型,我就给你悍马模型,先写个抽象类,然后两个不同型号的模型实现类,那我们把这个程序实现出来: HummerModel抽象类的程序清单如下:package t...
  • zq9017197
  • zq9017197
  • 2011年01月26日 22:37
  • 1403

设计模式 - Template Method Pattern(模板方法模式)

[源码下载]设计模式 - Template Method Pattern(模板方法模式)作者:webabcd介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得...
  • daonidedie
  • daonidedie
  • 2007年12月26日 21:34
  • 444

设计模式-模板方法模式(Template Method Pattern)

模板方法:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤。模式方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实...
  • MidnightIII
  • MidnightIII
  • 2011年03月21日 23:13
  • 171

设计模式系列(十二)模板方法模式(Template Method Pattern)

设计模式系列(十二)模板方法模式(Template Method Pattern)     模板方法模式是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法...
  • dan15188387481
  • dan15188387481
  • 2015年12月13日 16:41
  • 477

设计模式——模板方法模式( Template Method Pattern)

一、模板方法模式的定义 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 从定义可以看出,模板方法的本质是:封装算...
  • Linux2_SCDN
  • Linux2_SCDN
  • 2017年07月24日 00:21
  • 195

模板方法模式 template method pattern

我对模板方法模式的理解,其本质上是标准化。     所谓标准化是指在经济、技术、科学和管理等社会实践中,对重复性的事物和概念,通过制订、发布和实施标准达到统一,以获得最佳秩序和社会效益。来自百度百科>...
  • tnt87
  • tnt87
  • 2017年08月15日 11:55
  • 159
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式 —— 模板方法模式(Template method Pattern)
举报原因:
原因补充:

(最多只允许输入30个字)