设计模式14-观察者模式(发布-订阅模式)

1. 描述

一个对象状态改变引起其他对象自动更新。

2. 特点

1)目标和观察者建立了触发机制,目标被触发,观察者们做出相应处理。

2)通过目标和观察者抽象对象进行调用,降低了耦合关系。

3. 缺点

1) 存在循环调用的风险

2)观察者多事,更新时间会变久,影响程序效率。、

4. 结构

1)抽象目标

2)具体目标:触发该改变,调用观察者更新状态。

3)抽象观察者

4)具体观察者。

5.UML

6.示例

#include "stdafx.h"
#include <iostream>
#include <Set>
//1.抽象观察者
class Person
{
public:
	virtual void StartEat() = 0;

	void SetName(std::string name)
	{
		_Name = name;
	}
	std::string GetName()
	{
		return _Name;
	}
private:
	std::string _Name;
};
//2.具体观察者(被动变化者)
class Students :public Person
{
	void StartEat()
	{
		std::cout<<GetName().c_str() << "学生去学生食堂吃饭" << std::endl;
	}
};
class Teachs :public Person
{
	void StartEat()
	{
		std::cout << GetName().c_str() << "老师自己做饭吃" << std::endl;
	}
};
//3.抽象目标
class  Eat
{
public:
	void Add(Person * person)
	{
		_PersonList.insert(person);
	}
	void Remove(Person * person)
	{
		_PersonList.erase(person);
	}
	virtual void ClassOver() = 0;
protected:
	std::set<Person * > _PersonList;
};
//4.具体目标(触发变化者)
class  EatFranch:public Eat
{
public:
	void ClassOver()
	{
		for (auto it = _PersonList.begin(); it != _PersonList.end(); it++)
		{
			(*it)->StartEat();
		}
	}
};
int main()
{
	Person * studentXiaoming  = new Students;
	studentXiaoming->SetName("小明");
	Person * studentXiaohong = new Students;
	studentXiaohong->SetName("小红");
	Person * teachLiu = new Teachs;
	teachLiu->SetName("刘");

	Eat * franch = new  EatFranch;
	//订购
	franch->Add(studentXiaoming);
	franch->Add(studentXiaohong);
	franch->Add(teachLiu);

	//触发 发布
	franch->ClassOver();
	getchar();
	return 0;
}

7. 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值