看了两本关于设计模式的书,一本是用的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;
}
今天就写这么多了,过段时间再来看看。