观察者模式能很是大的减小模块以前的耦合。具体的观察者模式,客官们能够去看《设计模式》或者《Head first设计模式》等之类的书。java
在java中,java.util库中封装了观察者模式。在C++中并无这玩意。如下就是为了封装一个C++的观察者模式而写。git
观察者模式中,对于主题(subject)和观察者(observer)的接口能够是抽象出来的,而这些接口差很少都是通用的,而后要用时只要去继承这些接口,完成相应的处理便可。java中的实现也是同样的道理。github
观察者,很明显是要去观察同样东西。可是,对于不一样的具体实现,要观 察的东西并不一样啊!好比要实现一个天气预报的,我要观察温度、湿度等。要实现一个消息的显示程序,那么我要观察的就是消息了。对于不一样的实现,有些要观察 的不仅一个变量,有的只有一个变量。在C++中,可使用变长的参数表,可是,这样的实现会带来不少问题,好比类型安全等。还有什么办法能够处理不定个变 量呢?目前,我能想到的就只有用类、结构体去封装了。那么要适应不一样的类呢?那就要用到模板了。设计模式
如下是初步的实现。安全
subject类的设计以下:函数
template <typename TContent>
class Subject
{
public:
typedef TContent Content; ///< 观察的内容类型
typedef Observer<Content> AbstractObserver; ///< 观察者的抽象类型
void registerObserver(AbstractObserver *obs);
void unregisterObserver(AbstractObserver *obs);
void notifyObservers(TContent cnt);
private:
typedef std::list<AbstractObserver*> ObserverList;
typedef typename ObserverList::iterator ObserverListIterator;
ObserverList _observers;
};this
这里将要观察的内容设为TContent,若是要观察多个值的对象,能够封装一个struct,而后作为模板参数传进来。设计
observer类的设计以下:server
template <typename TContent>
class Observer
{
public:
typedef TContent Content;
/**
* @brief update 当有新内容时会被调用
*
* 子类化此类,重写这个函数
* @param cnt 将的内容经过这个参数传入
*/
virtual void update(TContent cnt) = 0;
private:
};对象
具体的实现代码,能够参见个人github。
这样封装后,就能够很方便使用了。如下是我使用的一个例子。
class ConcreteSubject : public Subject<int>
{
public:
ConcreteSubject() : times(0)
{
}
void run()
{
this->notifyObservers(times);
++times;
}
private:
int times;
};
class ConcreteObserver : public Observer<int>
{
public:
virtual void update(int cnt)
{
cout << cnt << endl;
}
};
丫丫吧,好店大全,畅销产品推荐 http://www.yayaba.cn