【设计模式】观察者模式

说明

观察者模式包含两个部分:观察者,提供调用函数;被观察者,注册观察者,并在一定的条件下执行观察者的函数。

下面是一个例子:

下面是具体的代码:

1. 观察者:

/******************** Observer **********************/
class Observer {
public:
	virtual void update();
};
void Observer::update() {
	cout << "Observer update" << endl;
}

class ConcreteObserver : public Observer {
public:
	void update() override;
};
void ConcreteObserver::update() {
	cout << "ConcreteObserver update" << endl;
}

2. 被观察者

/******************** Subject **********************/
class Subject {
public:
	vector<Observer *> *observers;
public:
	Subject();
	void registerObserver(Observer *ob);
	void unregisterObserver(Observer *ob);
	virtual void notifyObserver();
};
Subject::Subject() {
	observers = new vector<Observer *>();
}
void Subject::registerObserver(Observer *ob) {
	observers->push_back(ob);
}
void Subject::unregisterObserver(Observer *ob) {
	for (auto it = observers->begin(); it != observers->end(); it++) {
		if (ob == *it) {
			it = observers->erase(it);
			if (it == observers->end()) {
				break;
			}
		}
	}
}
void Subject::notifyObserver() {
	cout << "Subject notify" << endl;
}

class ConcreteSubject : public Subject {
public:
	void notifyObserver() override;
};
void ConcreteSubject::notifyObserver() {
	for (auto it = observers->begin(); it != observers->end(); it++) {
		(*it)->update();
	}
}

3. 测试函数:

int main(void) {
	Subject *s = new ConcreteSubject();
	Observer *o1 = new ConcreteObserver();
	Observer *o2 = new ConcreteObserver();
	s->registerObserver(o1);
	s->registerObserver(o2);
	s->notifyObserver();
	cout << "_________________分割线_________________" << endl;
	s->unregisterObserver(o2);
	s->notifyObserver();
	return 0;
}

4. 执行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值