【转】设计模式学习笔记(22)-模板方法

模板方法(Template Method)采取的手段类似于抽象工厂,他们都将父类的职责延迟到子类来实现,利用虚函数和多态性达到懒加载的目的。而对于目的来说,策略模式和模版方法更类似,定义一个多变的算法,然后将其抽离出来放在单独的类中,所不同的是策略模式采用的是委托的方式来实现,而模板方法利用类继承的多态性将算法结构延迟到子类来实现。一般意义上来说聚合优于继承,但模板方法的思想更巧妙,应用十分广泛。

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

模板方法的类图和抽象工程很类似,如下:

我们可以看出该模式的类图十分简单,一个抽象类:AbstractClass,一个具体实现类:ConcreteClass。抽象类中的TemplateMethod方法调用了PrimitiveOperation1和PrimitiveOperation2,这两个函数是虚函数,子类应该覆盖这两个函数。这样,当客户调用抽象类中的TemplateMethod时其实使用的是子类中的PrimitiveOperation。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class AbstractClass
{
public:
    void TemplateMethod(){
        PrimitiveOperation1();
        PrimitiveOperation2();
    }
    virtual void PrimitiveOperation1(){
        cout << "PrimitiveOperation1 from AbstractClass" << endl;
    }
    virtual void PrimitiveOperation2(){
        cout << "PrimitiveOperation2 from AbstractClass" << endl;
    }
};

这是抽象类

1
2
3
4
5
6
7
8
9
10
class ConcreateClass : public AbstractClass
{
public:
    virtual void PrimitiveOperation1(){
        cout << "PrimitiveOperation1 from ConcreateClass" << endl;
    }
    virtual void PrimitiveOperation2(){
        cout << "PrimitiveOperation2 from ConcreateClass" << endl;
    }
};

这是具体实现类
AbstractClass* ac = new ConcreateClass;
ac->TemplateMethod();
[/cpp]
主方法里这样调用,最后结果为:

1
2
PrimitiveOperation1 from ConcreateClass
PrimitiveOperation2 from ConcreateClass

我们可以看到我们调用父类的方法结果却返回子类的,这就表明我们在不改变父类实现的情况下实现的算法的改变。

模板方法模式是一种代码复用的基本结构,其导致一种反向控制的机构(好莱坞法则)。它的思想十分简单,但却用途广泛
我们来看看模板方法的适用性:

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  • 各子类中的公共行为应被提取出来集中到一个公共父类中以避免代码重复
  • 控制子类的扩展

上面的第三条十分常见于系统编程中的钩子(hook)操作,所谓hook是指在系统运行中用户程序插入系统程序的一种操作,如键盘钩子可以在键盘指令得到处理之前拦截请求等。
模板方法模式在各种类库的设计中十分常见,既保证了安全性有具有较强的扩展性。

posted on 2013-03-05 16:40  TheKingOfKingFish  阅读(133)  评论(0)    收藏  举报

导航