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

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/

 

模板方法模式简介

这是一个被用的相当广泛的一种设计模式,变体也特别多,他建立一个抽象类定义一个算法的结构,但是把细节部分的实现权力交个子类实现,是一种很灵活且代码重用性很高的设计模式。

 

模板方法模式的定义和基本结构

定义:在一个方法中定义一个算法的骨架,而将其中一些步骤的实现交给子类,模板方法模式使得子类在不改变算法结构的情况下,重新定义了算法中的某些步骤。

 

一张来自《Head First》的结构图。

是不是超级简单。

AbstractClass:一个超类,其中templateMethod()方法定义了算法结构,而下面的primitiveOperation方法则是结构中交个子类实现的那一部分。

ConcreteClass:继承了AbstractClass,并根据自己的需要实现了超类的抽象方法,在不改变超类算法结构的前提下得到了定制版的templateMethod()方法。

 

一个简单的实例(java)

我们用《Head First》书中制作饮料的例子来说明,无论是咖啡还是茶,做法其实都是相同的。

1,烧水。

2,放入茶叶/咖啡豆。

3,倒入杯中。

4,加入柠檬/牛奶。

从中我们可以看到这个制作方法(算法)结构是一定的,而且其中有不变的部分和会变的部分。不变的部分我们可以直接实现在超类中,而变的部分我们可以设置成抽象方法留给子类实现。下面我们直接来看代码吧。

首先给出超类 Beverage。

 1 public abstract class Beverage {
 2     public final void prepareRecipte(){
 3         boilWater();
 4         brew();
 5         pourInCup();
 6         addCondiments();
 7     }
 8     void boilWater(){
 9         System.out.println("boiling water");
10     }
11     void pourInCup(){
12         System.out.println("pouring into the cup");
13     }
14     abstract void brew();
15     abstract void addCondiments();
16 }

 

然后给出tea和coffee的实现。

public class Tea extends Beverage {
    @Override
    void brew() {
        System.out.println("steeping the tea");
    }
    @Override
    void addCondiments() {
        System.out.println("put lemon");
    }
}

public class Coffee extends Beverage {
    @Override
    void brew() {
        System.out.println("putting coffee bean");
    }
    @Override
    void addCondiments() {
        System.out.println("add milk");
    }
}

 

然后给出测试类。

1 public class Test {
2     public static void main(String[] args) {
3         new Tea().prepareRecipte();
4         System.out.println("");
5         new Coffee().prepareRecipte();
6     }
7 }

 

输出如下:

 

可以看到子类中实现的方法在算法结构中得到了体现,另外我们也可以将一些可重写或可不重写的函数在超类中给出一个实现,让子类决定要不要重写这个函数,这个函数一般被叫做回调函数(hook)。

 

另外工厂模式中的工厂方法其实是模板方法模式的一个特例,大家可以自行对比一下。

 

外观模式到此结束♪(^∇^*)。

 

参考资料:《Head First 设计模式》。

 

posted @ 2016-07-20 19:58  呆代待殆  阅读(264)  评论(0编辑  收藏  举报