文档章节

Observer 模式

Ne0o0
 Ne0o0
发布于 2017/05/02 17:09
字数 203
阅读 2
收藏 0
//Observer 模式
class Observer;
class Subject
{
public:
	Subject(){}
	~Subject(){}
private:
	list<Observer*>m_listObservers;
	int m_state;
private: 
	void DeAttach (string key);

 void notifyAllObservers();
public:
	void SetState(int state);
	void Attach(Observer* pObserver);
};

class Observer
{
public:
	Observer(Subject* pSubject):m_pSubject(pSubject){m_pSubject->Attach(this);}
	virtual ~Observer(){}
protected:
	Subject* m_pSubject;
	string key;
public:
	virtual void Update(){printf("Observer\n");}
	string& GetKey(){return key;}
};

void Subject::DeAttach (string key)
{
	list<Observer*>::iterator it=m_listObservers.begin();
	for (;it!=m_listObservers.end();++it)
	{
		if ((*it)->GetKey()==key)
		{
			break;
		}
	}
	if (it!=m_listObservers.end())
	{
		m_listObservers.erase(it);
	}

}

void Subject::notifyAllObservers()
{
	for (list<Observer*>::iterator it=m_listObservers.begin();it!=m_listObservers.end();++it)
	{
		(*it)->Update();
	}
}

void Subject::SetState(int state)
{
	m_state=state;
	notifyAllObservers();
}
void Subject::Attach(Observer* pObserver)
{
	string key=pObserver->GetKey();
	DeAttach(key);
	m_listObservers.push_back(pObserver);
}

class ObserverA:public Observer
{
public:
	ObserverA(Subject* pSubject):Observer(pSubject){key="ObserverA";}
	~ObserverA(){}
public:
	void Update(){printf("ObserverA\n");}
};

class ObserverB:public Observer
{
public:
	ObserverB(Subject* pSubject):Observer(pSubject){key="ObserverB";}
	~ObserverB(){}
public:
	void Update(){printf("ObserverB\n");}
};

//Observer 模式
int _tmain(int argc, _TCHAR* argv[])
{
	Subject *pSub=new Subject;
	Observer *pObserverA=new ObserverA(pSub);
	Observer *pObserverB=new ObserverB(pSub);
	pSub->SetState(1);
	delete pSub;
	delete pObserverA;
	delete pObserverB;
	getchar();
	return 0;
}

© 著作权归作者所有

上一篇: Strategy模式
下一篇: Comnand模式
Ne0o0
粉丝 2
博文 70
码字总数 29011
作品 0
程序员
私信 提问
Observer模式(观察者设计模式)

Observer 设计模式? 在Observer模式中,当观察对象的状态发生变化时,会通知给观察者。Observer模式适用于根据对象状态进行相应处理的场景。 Observer 并非主动观察,而是被动观察,实际可以...

---dgw博客
2018/10/28
0
0
ZooKeeper增加Observer部署模式提高性能(转)

除了Leader和Follow模式之外,还有第三种模式:Observer模式。 Observer:在不伤害写性能的情况下扩展ZooKeeper。 虽然通过Client直接连接到ZooKeeper集群的性能已经很好了,可是这样的架构假...

easonjim
2017/09/07
0
0
设计模式--观察者模式

观察者模式(observer): 示例: 观察者模式测试类ObserverTest.java 主题接口类Subject.java 观察者接口类Observer.java 猎头类HeadHunterImpl.java 求职者类JobSeekerImpl.java...

有钱有爱
2016/04/09
12
0
设计模式之-观察者模式(Observer)

观察者(Observer)模式标准定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 观察者(Observer)模式属于对象行为型模式。...

wenqi0501
2017/11/28
6
0
Observer模式相关类

Observable类 这是位于jdk包java.util中的类,该类实现了简单的Observer模式中的ConcreateSubject角色。Observable类使用Vector保存一组Observer的引用。 提供了添加和删除这些Observer引用的...

长平狐
2012/08/28
33
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
44分钟前
3
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
4
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部