观察者模式(4)——总结

在这里插入图片描述
观察者模式也叫发布——订阅模式(Publish/Subscribe)模式。
在这里插入图片描述
主题接口Subject.h

#pragma once

#include <string>
class Observer;

class Subject
{
public:
	virtual ~Subject() {}

	//增加观察者
	virtual void Attach(Observer* observer) = 0;
	
	//移除观察者
	virtual void Detach(Observer* observer) = 0;
	
	//通知
	virtual void Notify() = 0;

	virtual void SetSecretaryAction(const std::string &action) = 0;
	virtual std::string GetSecretaryAction() = 0;
};

抽象的观察者:
Observer.h

#pragma once

#include <string>

class Subject;

class Observer
{
public:
	Observer(Subject *sub, std::string name):m_sub(sub),m_name(name){}
	virtual ~Observer() {};
	virtual	void Update() = 0; //更新

protected:
	Subject		*m_sub;
	std::string m_name;
};

具体主题,或者说是具体通知者:
ConcreteSubject.h

#pragma once

#include <list>
#include <functional>

#include "Subject.h"

class Observer;

class ConcreteSubject : public Subject
{
public:
	ConcreteSubject();
	~ConcreteSubject();

	void Attach(Observer* observer);

	void Detach(Observer* observer);

	void Notify();

	void SetSecretaryAction(const std::string &action);

	std::string GetSecretaryAction();

private:
	std::list<Observer*> m_observers;
	std::string m_action;
};

ConcreteSubject.cpp

#include "ConcreteSubject.h"
#include "Observer.h"
#include <iostream>

ConcreteSubject::ConcreteSubject()
{
}

ConcreteSubject::~ConcreteSubject()
{
	m_observers.clear();
}

void ConcreteSubject::Attach(Observer * observer)
{
	m_observers.push_back(observer);
}

void ConcreteSubject::Detach(Observer * observer)
{
	m_observers.remove_if([observer](Observer * eachObserver) {
		return observer == eachObserver; //比较两指针指向的地址是否相等
	});
}

void ConcreteSubject::Notify()
{
	for (const auto &observer : m_observers)
	{
		observer->Update();
	}
}

void ConcreteSubject::SetSecretaryAction(const std::string & action)
{
	m_action = action;
}

std::string ConcreteSubject::GetSecretaryAction()
{
	return m_action;
}

具体的观察者,也就是具体被通知人。
ConcreteObserver.h

#pragma once

#include <string>
#include <iostream>

#include "Observer.h"
#include "Subject.h"

class ConcreteObserver : public Observer
{
public:
	ConcreteObserver(Subject *sub, std::string name) : Observer(sub, name) {}
	~ConcreteObserver() = default;

	//关闭股票行情
	void Update() override
	{
		std::cout << "观察者" << m_name << "的状态是" << m_sub->GetSecretaryAction() << std::endl;
	}
};

测试:
main.cpp

#include "ConcreteObserver.h"
#include "ConcreteSubject.h"

int main()
{
	ConcreteSubject *subject = new ConcreteSubject();
	ConcreteObserver *xObserver = new ConcreteObserver(subject, "X");
	ConcreteObserver *yObserver = new ConcreteObserver(subject, "Y");

	subject->Attach(xObserver);
	subject->Attach(yObserver);

	subject->Detach(yObserver);

	subject->SetSecretaryAction("ABC");
	subject->Notify();

	delete subject;
	delete xObserver;
	delete yObserver;

	getchar();
	return 0;
}

运行结果:

观察者X的状态是ABC
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值