设计模式--观察者模式

设计模式–观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个对象,当被监听对象发生变化时,会通知所有观察者。

UML类图:

img

抽象目标作为基类,并依赖于一个抽象观察者。具体目标的Notify会通过抽象观察者调用具体观察者(ConcreteObserver)的update,达到通知观察者的目的。具体目标(ConscreteSubject)对象内部会维护一份观察患者名单,Attach\Detach增加或删除观察者。

具体目标和具体观察者需要继承抽象目标和查偶像观察者

具体观察者需要重写update,具体目标需要重写Notify/Attach/Detach

代码:

//Observer.h

#include "stdafx.h"
#include <iostream>
#include <list>

class AbstractObserver;

//抽象目标
class AbstractSubject 
{
public:
	virtual void Attach(AbstractObserver* ob) = 0;
	virtual void Detach(AbstractObserver* ob) = 0;
	virtual void Notify() = 0;
};

/*抽象观察者*/
class AbstractObserver 
{
public:
	virtual void Update(int v) = 0;
};


/*具体目标*/
class ConcreteSubject : public AbstractSubject 
{
public:
	void Attach(AbstractObserver* ob);
	void Detach(AbstractObserver* ob);
	void Notify();
	void SetState(int v) { subjectstete = v; }
private:
	int subjectstete;
	std::list<AbstractObserver*> Ob_list; //一个具体目标会有多个观察者,维护一份观察者名单,抽象基类指针从链表删除的时候注意
};


/*以下两个观察者是两个不同的类哦*/
/*具体观察者1*/
class ConcreteObserver_1 : public AbstractObserver
{
public:
	ConcreteObserver_1(AbstractSubject* absub) : m_subject(absub){}
	void Update(int v) { std::cout << "观察者1得知目标状态:" << v <<std::endl; }
private:

	AbstractSubject *m_subject;  //依赖一个抽象目标
};

/*具体观察者2*/
class ConcreteObserver_2 : public AbstractObserver
{
public:
	ConcreteObserver_2(AbstractSubject* absub) : m_subject(absub) {}
	void Update(int v) { std::cout << "观察者2得知目标状态:" << v <<std::endl; }
private:

	AbstractSubject *m_subject;  //依赖一个抽象目标
};
//Observer.cpp
#include "stdafx.h"
#include "Observer.h"



void ConcreteSubject::Attach(AbstractObserver * ob)
{
	Ob_list.push_back(ob);
}

void ConcreteSubject::Detach(AbstractObserver * ob)
{
	std::list<AbstractObserver*>::iterator it = Ob_list.begin();
	for (; it != Ob_list.end();) {
		if (*it == ob){
			it = Ob_list.erase(it);	
			std::cout << "删除一个"<<std::endl;
		}
		else{
			it++;
		}
	}
}

void ConcreteSubject::Notify()
{
	std::list<AbstractObserver*>::iterator it = Ob_list.begin();
	for (;it != Ob_list.end();it++){
		(*it)->Update(subjectstete);
	}
}


int main()
{
	//创建目标
	
	ConcreteSubject *p_subject = new ConcreteSubject;

	//创建观察者
	//父类指针指向子类对象
	//传参是要观察的具体目标
	AbstractObserver *p_observer = new ConcreteObserver_1(p_subject);
	AbstractObserver *p_observer2 = new ConcreteObserver_2(p_subject);

	//目标注册观察者
	p_subject->Attach(p_observer); 
	p_subject->Attach(p_observer2);

	//当目标发生变化
	p_subject->SetState(666);

	//通知所有观察者
	p_subject->Notify();

	p_subject->Detach(p_observer);
	p_subject->Detach(p_observer2);
	delete p_subject;
	delete p_observer;
	delete p_observer2;
	getchar();
    return 0;
}

结果:
在这里插入图片描述

参考文章:
https://www.cnblogs.com/carsonzhu/p/5770253.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值