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

作者:一雨田(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);
}

// 呵呵,请拷贝代码编译执行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值