设计模式之观察者模式实例(c++)

观察者模式

定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆可得到通知并被自动更新。

观察者模式又叫做发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听器(Source-Listener)模式。

观察者模式实例之猫、狗与老鼠

设计模式之观察者模式实例(c++)_第1张图片

从类图可知, MySubject需要保存(关联)MyObserver的对象,当MySubject发出通知时cry(),将会遍历ArrayList中的MyObserver的response函数,来实现MyObserver观察者(被动)更新的效果。

下面是c++实现的版本

抽象观察者MyObserver

//抽象观察者MyObserver
class MyObserver{
public:
	virtual void response();
};

抽象目标类MySubject 

//抽象目标类MySubject
class MySubject{
public:
	//注册 
	void attach(MyObserver *observer){
		observers.push_back(observer);
	}
	
	//注销
	void detach(MyObserver *observer){
		for(auto it = observers.begin() ; it!=observers.end() ; it++){
			if(*it == observer){
				observers.erase(it);
				break;
			}
		}
	}
protected:
	vector observers;
}; 

具体目标类Cat(猫类) 

//具体目标类Cat(猫类)
class Cat : public MySubject{
public:
	void cry(){
		cout << "猫叫!" << endl;
		for(auto obs : observers){
			obs->response();
		}
	}
}; 

具体观察者类Mouse(老鼠类) 

//具体观察者类Mouse(老鼠类)
class Mouse : public MyObserver{
public:
	void response(){
		cout << "老鼠逃跑!" << endl;
	}
}; 

具体观察者类Dog(狗类) 

//具体观察者类Dog(狗类)
class Dog : public MyObserver{
public:
	void response(){
		cout << "狗叫!" << endl;
	}
}; 

客户端测试  

//客户端测试 
int main(void){
	//创建目标 
	Cat cat;
	
	//创建观察者 
	Mouse m1,m2;
	Dog dog;
	
	//订阅 
	cat.attach(&m1);
	cat.attach(&m2);
	cat.attach(&dog);
	
	//更新 
	cat.cry();
	
	return 0;
} 

输出结果

你可能感兴趣的:(设计模式(c++))