【重读设计模式】模版方法模式

来源:互联网 发布:没货源怎么开淘宝店 编辑:程序博客网 时间:2024/06/15 09:27

提到模版方法模式,不由自主的想到了c++的标准模版库,因为STL基本就是模版方法的一个实现。STL是如此的深入人心,以至于使用到该设计模式的机会是那么的少。


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

           比较容易理解的定义,在一个基类的核心方法中,定义一个成员函数的调用顺序,这些函数都被子类重写,在多态的情况下,自己实现的函数会覆盖父类的函数,也就是将步骤延迟到子类中。我们将核心方法声明为非virtual的,也就是不可改写。这样就相当于没有改变算法结构的前提下,重写了算法中的某些步骤,从而达到了目的。


使用场景:一批类都需要实现相似的功能,为了让代码尽量的复用。


例子:豆浆机相信大家都用过,相信榨豆浆的过程大家也都很清楚,假设我们就是豆浆机的芯片的制作者,不管要榨什么豆浆(黄豆还是黑豆又或者是绿豆),都遵循相同的榨豆浆流程,首先是加水、浸泡、磨碎、压榨、煮熟。这个过程是不会改变的,但是每个过程内有可能有所不同,比如红豆加水的分是20ml/g,而黑豆加水的分量是18ml/g,绿豆是15ml/g,浸泡的时间也分红豆8分钟,黑豆9分钟,绿豆5分钟,磨碎的时间是一样的,压榨和煮熟都是一样的。


设计:由于不管榨任何类型的豆子的豆浆都是一样的,我们将豆子做成基类,该类有以下几个方法加水addwater,浸泡soak,磨碎attrite,压榨press,煮熟boil。由于加水和浸泡这两个动作是跟着豆子的种类不同而行为不同,我们将它作为抽象方法,而attrite,press,boil这三个方法每种豆子都一样,所以由基类实现。


类图:


实现:

//============================================================================
// Name        : templatemethod.cpp
// Author      : tester
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================


#include <iostream>
#include <stdio.h>
using namespace std;


//基类
class CBean
{
public:
CBean(){};
virtual ~CBean(){};


void paly_soya()
{
addwater();
soak();
attrite();
press();
boil();
}


protected:


virtual void addwater()=0;


virtual void soak()=0;


void attrite()
{
printf("attrite 8 minites.\n");
}


void press()
{
printf("press 4 minites.\n");
}


void boil()
{
printf("boil 5 minites.\n");
}
};


class CRedBean : public CBean
{
public:
void addwater()
{
printf("add 20ml/g water.\n");
}


void soak()
{
printf("soak 8 minites.\n");
}
};


class CYellowBean : public CBean
{
public:
void addwater()
{
printf("add 18ml/g water.\n");
}


void soak()
{
printf("soak 8 minites.\n");
}
};


class CGreenBean : public CBean
{
public:
void addwater()
{
printf("add 15ml/g water.\n");
}


void soak()
{
printf("soak 9 minites.\n");
}
};


int main() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!


CYellowBean yellowbean;
yellowbean.paly_soya();


CRedBean redbean;
redbean.paly_soya();


CGreenBean greenbean;
greenbean.paly_soya();
return 0;
}


总结:模版方法模式使用一个模版方法,使某些过程在子类中去修改原来的方法。其实stl中的容器使用了这种设计思路,但并不是完整的模版方法模式,另外一方面泛型算法也使用了模版方法模式的思路。

0 0
原创粉丝点击