2.7 设计模式之观察者模式

观察者模式

观察者模式也叫发布/订阅模型, 被观察者的状态改变,会传递一个消息(事件)给观察者们.
// 观察者
class IObserver
{
public:
	IObserver() {}
	virtual ~IObserver() {}

public:
	virtual void update() = 0;

};


// 被观察者
class ISubject
{
public:
	ISubject() {}
	virtual ~ISubject() {}

public:
	
	// 添加观察者
	void attach(IObserver* observer) {
		if (observer == NULL) {
			return;
		}

		for (auto it : observerVec) {
			if (it == observer)
				return;
		}

		observerVec.push_back(observer);
	}

	// 删除观察者
	void detach(IObserver* observer) {
		if (observer == NULL) {
			return;
		}
		for (vector<IObserver*>::iterator it = observerVec.begin();it != observerVec.end();++it) {
			if (*it == observer) {
				observerVec.erase(it);
				break;
			}
		}
	}

	// 通知观察者
	void notify() {
		for (auto it : observerVec) {
			if (it != NULL) {
				it->update();
			}
		}
	}

private:
	vector<IObserver*> observerVec;

};



// 具体被观察者
class concreteSubject:public ISubject
{
public:
	concreteSubject() {}
	~concreteSubject() {}

public:
	void doSomething() {
		cout << "我是被观察者,我正在..." << endl;
		ISubject::notify();
	}
};


//观察者A
class observerA : public IObserver
{
public:
	observerA() {}
	~observerA() {}

public:
	virtual void update() {
		cout << "我是观察者A, 我观察到..." << endl;
	}
};

//观察者B
class observerB : public IObserver
{
public:
	observerB() {}
	~observerB() {}

public:
	virtual void update() {
		cout << "我是观察者B, 我观察到..." << endl;
	}
};

void test_observed(){
	concreteSubject* subject = new concreteSubject();
	observerA* oA = new observerA();
	observerB* oB = new observerB();

	cout << "--------------------添加A观察者-----------------------------------" << endl;
	subject->attach(oA);
	subject->doSomething();

	cout << "--------------------添加B观察者-----------------------------------" << endl;
	subject->attach(oB);
	subject->doSomething();

	cout << "--------------------删除A观察者-----------------------------------" << endl;
	subject->detach(oA);
	subject->doSomething();

	cout << "--------------------删除B观察者-----------------------------------" << endl;
	subject->detach(oB);
	subject->doSomething();

	delete subject;
	delete oA;
	delete oB;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值