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.