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 执行结果


四、优缺点


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值