c++实现c#委托机制

看了两本关于设计模式的书,一本是用的java语言描写的《设计模式之禅》,另一本是用C#语言描述的《大话设计模式》,两本都不是我常用的C/C++,不过C++是面向对象的语言,当然你也可以用它编写面向过程的程序。
       既然C++是面向对象的语言,那么所有的两本书讲的所有的设计模式都应该能够实现,只是实现的具体方法不一样而已,比如一个单例模式,用java实现的方法如下:
    class Sington
    {
        private static Sington sig=null;
        private Sington(){}
        public static Sington GetInstance()
        {
            if(sig==null)
                sig=new Sington;
            return sig;
        }
    };

    而用C++实现的代码如下:
    class Sington
    {
    private:
            Sington(){}
    public:
            static Sington& GetInstance()
            {
                    static Sington  sig;
                    return sig;
            }       
    };
所以,即便是语言有所不同,但是设计模式还是一样的,只是实现的方式有些区别而已
在看到用C#语言描述的观察者模式的时候,如果用C#的委托机制,那是很容易的一件事情,但是如果一种语言没有委托机制,那么怎么去实现观察者模式呢?比如C++,就没有委托机制,怎么办?不要怕,不要急,接下来我们就用C++的一些高级技术来实现C#的委托机制。

代码如下:

// Delegate.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

/****************************************************
这个是为了通过C++的一些技术实现C#的委托机制.
****************************************************/

#include <iostream>
using namespace std;
#include <vector>


//
委托事件类

//使用模板技术
template<class T> 
class DelegateEvent
{
 typedef void (T::*PFun)();  //
定义成员函数指针.
public:
 T* m_obj;
 PFun m_fun;
public:
 DelegateEvent(T* obj,PFun fun)
 {
  m_obj=obj;
  m_fun=fun;
 }
};


class Observe; //
抽象观察者类.


//
委托类
class Delegate
{
 vector<DelegateEvent<Observe>*> events;       //
使用STL容器
public:
 //重载+=运算符.
 Delegate& operator+=(DelegateEvent<Observe>* e)
 {
  events.push_back(e);
  return *this;
 }
 
 //使用函数子对象.
 void operator()()
 {
  for(int i=0;i<events.size();++i)
  {
   DelegateEvent<Observe>* e=events.at(i);
   (e->m_obj->*e->m_fun)();  //这句最强悍,不容易看懂.
  }
 }
};

//通知者
class Subject
{
public: 
 Delegate del;
 void notify()
 {
  del();
 }
};

//抽象观察者类
class Observe
{
public:
 virtual void update()=0;        //
使用纯虚函数机制.
};

//玩游戏的同事类
class PlayGame:public Observe
{
 void update()
 {
  cout<<"
老板回来了,关掉游戏,开始工作\n";
 }
};

//聊QQ的同事类
class ChatQQ:public Observe
{
 void update()
 {
  cout<<"老板回来了,关掉QQ,开始工作\n";
 }
};


int main(int argc, char* argv[])
{
 Subject sub;      //
定义一个通知者

 //定义两个同事
 PlayGame ts1;
 ChatQQ ts2;
 
 //
根据两个同事定义两个委托事件.
 DelegateEvent<Observe>* e1=new DelegateEvent<Observe>(&ts1,Observe::update);
 DelegateEvent<Observe>* e2=new DelegateEvent<Observe>(&ts2,Observe::update);
 
 //将委托事件添加到通知者的委托里面.
 sub.del+=e1;
 sub.del+=e2;

 //通知者通知
 sub.notify();

 //删除委托事件
 delete e1;
 delete e2;

 return 0;
}

今天就写这么多了,过段时间再来看看。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值