观察者设计模式:
行为型设计模式 主要是定义了一个状态发生改变后会去影响的对象 比起我们手动的去遍历所有对象然后去判断要快的多 也叫订阅发布者设计模式 也可以订阅我敢兴趣的消息 当我感兴趣的消息发生时 我将自动收到消息并处理
观察者模式是一种对象行为型模式,其主要优点如下: - 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。 - 目标与观察者之间建立了一套触发机制。
它的主要缺点如下: - 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。 - 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
uml图如下:
我这里只具现化了一个具体观察者类 其实可以有很多具体观察者类和被观察者类 具体就可以自己添加啦 我这里只实现最主要的骨架
//观察者设计模式
//当一个事情发生的时候 或者说当一个物体的状态发生改变的时候 我们总是希望改变与之相关的物体的状态
//也就是说我们具体对象希望关注到某一个状态的改变 这个时候通常的做法有两种
//第一种 当状态发生改变的时候 我们去遍历所有对象 找到希望关注该状态发生改变的对象
//第二种 新引入一个类 该类作为状态的发起者 其他人作为观察者 由他来通知所有对象
//明显 第二种方法和模式更加值得我们去使用 无论是性能还是代码可读性都更强
//我们构造如下一种场景有一个动物园 他有不同的园区 当某一个园区闭园时我们希望让该园区的所有人员退场
#include<list>
#include<string>
#include<iostream>
class Observer
{
public:
virtual void ReceiveMessage(std::string message) = 0;
};
class human :public Observer
{
public:
void ReceiveMessage(std::string message)
{
//收到消息后做一些事情
std::cout << "发生什么事了?" << message<<std::endl;
}
};
class Object
{
public:
virtual void addObserver(Observer* ob)=0;
virtual void removeObserver(Observer* ob)=0;
virtual void notifyObserver()=0;
protected:
std::list<Observer*> ob_list_;
};
class ZooObject:public Object
{
public:
void addObserver(Observer* ob)
{
ob_list_.emplace_back(ob);
}
void removeObserver(Observer* ob)
{
for (auto it = ob_list_.begin(); it != ob_list_.end(); it++)
{
if (*it == ob)
{
ob_list_.erase(it);
break;
}
}
}
void notifyObserver()
{
for (auto i : ob_list_)
{
i->ReceiveMessage("动物园闭园了");
}
}
};
int main()
{
human man1;
human man2;
human man3;
//这三个B希望关注到动物园是不是闭园了 我们建立一个动物园状态 也就是被观察者
ZooObject Zoo;
Zoo.addObserver(&man1);
Zoo.addObserver(&man2);
Zoo.addObserver(&man3);
Zoo.notifyObserver();
Zoo.removeObserver(&man1);
Zoo.notifyObserver();
}
测试一下: