您的位置:首页 > 编程语言

设计模式简单代码之Template Method模式(追MM篇)

2006-08-17 08:20 357 查看
作者:一雨田(http://blog.csdn.net/dylgsy/)。本文欢迎转贴,并请保留此信息
Template Method模式:

实际上就是把一件事情分成几步来完成。每一步就是一个方法(也叫做原子操作)。也就是说,我把做一件事情规定好了几步(规定了个模版),但每一步里 实际干些什么就由客户去决定了。对应到C++里就是采用虚函数的办法。(所以说虚函数是面向对象里一个非常重要的概念,它的作用在于把具体的实现延迟了, 也就是提供了接口)。

请看一个实例--追MM,我把追MM分成了认识她、接近她、感动她三步(然后下一步能否追到还要看一点的运气了,可能成了你的妹妹,呵呵),伪代码如下:
追MM
{
认识她;
接近她;
感动她;
}
注意上面的三步是我已经定义好了,它们之间的先后关系是不能更改的,能改的只是每一步的实际内容。

张三是这样完成这三步的:
1、认识她:扮曾经认识。张三:"哎呀,我们好像在什么地方见过。" MM想:"真是老土死了"。
2、接近她:张三:"有没兴趣晚上一起自习啊?" MM想:"唉呀,怎么男的全来这一招啊?"
3、感动她:张三:"我要向全世界说爱你!!" MM想:"真是无聊,爱我关全世界什么事?"
结果,张三失败了。

一雨田是这样完成三步的:
1、 认识她:一雨田说:"你宿舍的XX好漂亮啊!!"。MM想:"这个人怎么不注意一下我呢?难道我比某人差吗?"(嘻嘻,女人的妒忌心就要这样利用了)
2、 接近她:一雨田说:"我要去跑步了,你个胖妞,你别跟着来啊!"MM说:"哼,我就是要去,怎么样?"。(呵呵,以退为进)
3、 感动她:一雨田说:"帮你切牛扒吧,整天手忙脚乱的"然后一块块细心的切好。MM想:"从来没人帮我这样切牛扒的。。。"。呵呵,乘胜追击。一雨田深情的轻轻的说:"让我一辈子帮你切牛扒吧。" MM:无语(流泪,感动)。(注:要从小地方去感动MM)
结果,一雨田成功了。

呵呵,明白Template Method模式了吧,下面就开始看看代码咯。
等一下,这里还有个问题,如何发现原子操作呢?
我们可以套用一句话:
当你关注它,它就是一个对象。同样,当你关注它,它就是一个原子操作。

好了,我们来看看上面的实例怎么用C++ 把它表达出来。

#include <iostream>
using namespace std;

// 追MM模版
class CatchMMTemplate
{
public:
bool CatchMM()
{
// 失败次数大于等于2就没戏了
int nFailedCnt = 0;
if(!RenShi())
nFailedCnt++;
if(!JieJin())
nFailedCnt++;
if(!GanDong())
nFailedCnt++;

if(nFailedCnt >= 2)
return false;
return true;
}

char szName[20];

protected:
virtual bool RenShi() = 0;
virtual bool JieJin() = 0;
virtual bool GanDong() = 0;

};

class ZhanSan: public CatchMMTemplate
{
public:
ZhanSan(char *pszName)
{
strcpy(szName, pszName);
cout << "我是" << szName << endl;
}

// 只需要重载三个函数就行
protected:
virtual bool RenShi()
{
cout << "哎呀,我们好像在什么地方见过。" << endl;
// MM 不喜欢,返回false
return false;
}
virtual bool JieJin()
{
cout << "有没兴趣晚上一起自习啊?" << endl;
// MM 不喜欢,返回false
return false;
}
virtual bool GanDong()
{
cout << "我要向全世界说爱你!!" << endl;
// MM 不喜欢,返回false
return false;
}
};

class YuTian: public CatchMMTemplate
{
public:
YuTian(char *pszName)
{
strcpy(szName, pszName);
cout << "我是" << szName << endl;
}
// 只需要重载三个函数就行
protected:
virtual bool RenShi()
{
cout << "你宿舍的XX好漂亮啊!!" << endl;
// MM 喜欢,返回true
return true;
}
virtual bool JieJin()
{
cout << "我要去跑步了,你个胖妞,你别跟着来啊!" << endl;
// MM 喜欢,返回true
return true;
}
virtual bool GanDong()
{
cout << "帮你切牛扒吧,整天手忙脚乱的" << endl;
// MM 喜欢,返回true
return true;
}
};

void Catch(CatchMMTemplate *c)
{
if(!c->CatchMM())
{
cout << c->szName << "失败" << endl;
}
else
{
cout << c->szName << "成功" << endl;
}
}

// 在上帝的剧本里写上一段浪漫的爱情
void main()
{
ZhanSan z("张三");
Catch(&z);

YuTian y("一雨田");
Catch(&y);
}

// 呵呵,请拷贝代码编译执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: