Cocos2d-x常用设计模式—观察者模式
发表于2017-12-21
观察者模式就是发送一个消息,让观察者执行某个动作,可用于数据传递,以可以用于消息传递。上一篇给大家介绍了Cocos2d-x的单例模式,下面我们继续介绍Cocos2d-x常用的设计模式,观察者模式。
一、动机及适用情况
二、类图
三、C++代码实现
3.1 头文件Observer.h
#include <iostream> #include <list> using namespace std; // 抽象类 class Observer { public: virtual void update() = 0; }; class Subject { public: virtual void attachObserver(Observer*) = 0; virtual void detachObserver(Observer*) = 0; virtual void notifyObservers() = 0; }; // 具体类 class ConcreteObeserver :public Observer { public: ConcreteObeserver(Subject* pSubject); virtual void update(); private: Subject* m_pSubject; }; class ConcreteObserver2 : public Observer { public: ConcreteObserver2(Subject* pSubject); virtual void update(); private: Subject* m_pSubject; }; class ConcreteSubject :public Subject { public: virtual void attachObserver(Observer*); virtual void detachObserver(Observer*); virtual void notifyObservers(); private: list<Observer*> m_observer; };
3.2 cpp文件Observer.cpp
#include "Observer.h" // 具体观察者的实现(定义) ConcreteObeserver::ConcreteObeserver(Subject* pSubject) :m_pSubject(pSubject) { } void ConcreteObeserver::update() { cout << "override method update of ConcreteObserver class " << endl; } ConcreteObserver2::ConcreteObserver2(Subject* pSubject) :m_pSubject(pSubject) { } void ConcreteObserver2::update() { cout << "override method update of ConcreteObserver2 class " << endl; } // 具体目标(被观察者)的实现 void ConcreteSubject::attachObserver(Observer* observer) { m_observer.push_back(observer); } void ConcreteSubject::detachObserver(Observer* observer) { m_observer.remove(observer); } void ConcreteSubject::notifyObservers() { for (auto it = m_observer.begin(); it != m_observer.end(); it++)// list<Observer*>::iterator it = m_observer.begin() { (*it)->update(); } } void main() { // 创建具体目标和具体观察者实例 ConcreteSubject* pSubject = new ConcreteSubject(); ConcreteObeserver* pObserver = new ConcreteObeserver(pSubject); ConcreteObserver2* pObserver2 = new ConcreteObserver2(pSubject); // 目标对象注册观察者 pSubject->attachObserver(pObserver); pSubject->attachObserver(pObserver2); // 通知所有观察者 pSubject->notifyObservers(); // 释放资源 delete pSubject; delete pObserver; delete pObserver2; cin.get(); }
3.3 执行结果