设计模式汇总4(转)
2008-10-29 19:28
302 查看
20.template method 模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。 template method示例代码: ============================================================= #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); } ================================================================== 21.visitor 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类 visitor示例代码: ======================================================================== #include <iostream> #include <string> using namespace std; class Element; /// Visitor类及其子类 class Visitor { public: virtual void Visit(Element *e) = 0; }; class VisitorA : public Visitor { public: virtual void Visit(Element *e) { cout << "执行操作A" << endl; } }; class VisitorB : public Visitor { public: virtual void Visit(Element *e) { cout << "执行操作B" << endl; } }; /// Element类及其子类 class Element { public: virtual void Accept(Visitor *v) { cout << m_name ; v->Visit(this); } string &GetName() { return m_name; } protected: string m_name; }; class ElementA : public Element { public: ElementA(string s) { m_name = s; } }; class ElementB : public Element { public: ElementB(string s) { m_name = s; } }; /// 测试上面的类 void main() { ElementA ea("元素A"); ElementB eb("元素B"); VisitorA va; VisitorB vb; // 双分派,“接受者”和“访问者”决定了一个操作 ea.Accept(&va); ea.Accept(&vb); eb.Accept(&va); eb.Accept(&vb); } |