读书人

设计模式之观察值模式C++实现(上部

发布时间: 2012-12-24 10:43:14 作者: rapoo

设计模式之观察值模式,C++实现(下部分)

原文地址: http://blog.csdn.net/iuhsihsow


恩,这部分就是单纯的委托了

直接贴代码

// 委托就是i一种引用方法的类型,一旦为委托分配了方法,委托将与 // 该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样, // 具有参数和返回值,委托可以看做是对函数的抽象,是函数的“类”,委托 // 的实例代表一个具体的函数  // 委托对象所搭载的所有方法必须具有相同的原型和相识, // 也就是有相同的参数列表和返回值类型   // C++ 函数指针很神奇,不是吗?  #include "stdafx.h" #include <Windows.h> #include <iostream> #include <vector> using namespace std;  // 对象类,也可以使用类模板来实现 // 实际上,对于void* pArg可以进行进一步的封装 class Object { public: typedef long (Object::*pFunc)(Object *pObj, void* pArg); protected: private: };   class NameContainer { public: string strName; };  // 事件类 class EventHandler { public: EventHandler(Object *pObject, Object::pFunc pFuncion) : m_pObj(pObject) , m_pFunc(pFuncion) {  }  long operator()(Object* pObj, void* pArg) { return (m_pObj->*m_pFunc)(pObj, pArg); } protected: Object*m_pObj; Object::pFuncm_pFunc; private: };  // 事件类的容器 class EventsContainer { public: // 某些重载就不写了 EventsContainer& operator +=(const EventHandler& rEvent) { m_EventsVec.push_back(rEvent); return *this; } long operator()(Object* pObj, void *pArg) { for (int i = 0; i < m_EventsVec.size(); i ++) { // 暂不对返回值进行判断 m_EventsVec[i](pObj, pArg); } return 0; } protected:  private: vector<EventHandler>  m_EventsVec; };    class PersonA : public Object { public: PersonA(const string &strName) { m_strName = strName; } long TellName(Object *pObj, void* pArg) {  // 当然,PersonA是知道这个函数是干什么的,参数是什么 // 如果不知道的话,利用多态也可以很好解决问题 // 大不了就是抽象出参数部分处理函数 string strName = (*((NameContainer*)pArg)).strName;  cout<<"Hello! "<<strName.c_str()<<".\nMy name is: "<<m_strName.c_str()<<endl; // 直接cout pArg 就是这个指针的地址了 return 1; } protected: private: string m_strName; };  int _tmain(int argc, _TCHAR* argv[]) { EventsContainer  tellName; PersonA *pA = new PersonA("Joky"); // Joky不是一个敏锐的人,所以他每次参加聚会前都带着一个提示器 // 以便于第一时间做自我介绍,尤其是对美女 // 提示器是[tellName]系统 //注册事件 tellName += EventHandler( (Object*)pA, // 主体  (Object::pFunc)&PersonA::TellName);  // 事件  // 在一次聚会上 // Joky通过[tellName}系统获得了一个陌生人的名字 // 陌生人叫[Fuuny] NameContainer nc; nc.strName = "Fuuny"; tellName(pA, (void*)&nc);  if (pA) { delete pA; pA = NULL; }  return 0; }   // 执行结果 //Hello! Fuuny. //My name is: Joky //请按任意键继续. . .


读书人网 >软件开发

热点推荐