Template Method

来源:互联网 发布:淘宝委托权书模板 编辑:程序博客网 时间:2024/04/27 23:22

在做有些事情的时候,你会发现每次的步骤都一样,只是其中的一两个步骤完成的方式会稍微有点差别。考虑一下你冲咖啡和泡茶的过程:

冲咖啡

1、  盛一些水

2、  把咖啡倒入水中泡一会儿

3、  将泡好的咖啡盛到杯子里

泡茶

1、  盛一些水

2、  将茶叶放入水中泡一小会儿

3、  将泡好的茶叶盛到杯子里

于是我们马上可以得到两个类:

class Coffer

{

public:

void Prepare()

{

    BoilWater();

    BrewCoffeeGrinds();

    PourInCup();

}

protected:

void BoilWater() { cout << “Boiling some water” << endl; }

void BrewCoffeeGrinds() { cout << “Dripping Coffee through filter” << endl; }

void PourInCup() { cout << “Pouring into cup” << endl; }

};

 

class Tea

{

public:

void Prepare()

{

    BoilWater();

    SteepTeaBag();

    PourInCup();

}

protected:

void BoilWater() { cout << “Boiling some water” << endl;}

void SteepTeaBag() { cout << “Steep the tea” << endl; }

void PourInCup() { cout << “Pouring into cup” << endl; }

};

 

代码出来了,但是你会发现,这两个类里边有很多重复的代码,唯一不同仅仅制作过程中的第二步有些差别,于是我们马上就想到了一个方法,把相同的部分移动到他们公共的基类离去。恩,这是个不错的想法,动手吧。

class CaffeineBeverage

{

public:

void Prepare()

{

    BoilWater();

    Brew();

    PourInCup();

}

protected:

void BoilWater() { cout << “Boiling some water” << endl; }

void PourInCup() { cout << “Pouring into cup” << endl; }

 

virtual void Brew();

};

 

class Coffer : public CaffeineBeverage

{

protected:

    virtual void Brew() { cout << “Dripping Coffee through filter” << endl; }

};

 

class Tea : public CaffeineBeverage

{

protected:

virtual void Brew() { cout << “Steep the tea” << endl; }

};

 

这个类层次很简单,UML结构如下:

我们来写一个测试代码看看情况如何:

void main()

{

CaffeineBeverage* p = NULL;

p = new Coffee;

p->Prepare();

delete p;

 

p = new Tea;

p->Prepare();

delete p;

}

看看输出什么:

Boiling some water

Dripping Coffee through filter

Pour into cup

Boiling some water

Steep the tea

Pour into cup

基本上,我们已经看到了Template Method模式的样子了。Template Method模式的规范UML形式如下:

Template Method模式其实应用很广泛,以至于很多时候你用了该模式而没有意识到你已经使用了它。它使用了OOP原则中的Dependency Inversion Principles原则,即上层模块的某些方法实现需要依赖底层模块的实现。这样控制权掌握在上层模块,而实现却在底层模块中。Template Method模式和Strategy模式其实是解决了同一个问题,只是使用了不同的方式而已。相比起来,Strategy使用组合而不是继承,灵活性更大一些,但是StrategyContext使用了委托技术,在时间和空间上都无法和Template Method模式相比。细看Template Method模式,和一般的多态技术基本上没有区别。其实说白了,设计模式就是OOP设计经验的积累,为了便于交流,人们便在一个特定场景中给特定的结构框架去了一个名字,它们的目标都是为了:松耦合、高内聚。