观察者模式:
当多个对象需要根据同一种状态的改变而同时做出改变,
这个时候需要使用观察者模式,其实也就是C#中的委托和事件
优点:
1.低耦合性
各个观察者不需要依赖具体的Subject,Subject也不需要关注具体订阅者
2.同步及高效
当多个对象需要根据另外一个对象的状态改变而改变的时候,如果使用循环检测,则会消耗大量资源;
而观察者模式是只有在改变的时候会通知一次。
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <list>
using namespace std;
//观察者
class IObserver
{
public:
virtual void Update() = 0;
virtual string GetName() = 0;
};
//主题发布者
class Subject
{
public:
void Attach(IObserver* item)
{
observer_list.push_back(item);
}
void Detach(IObserver* item)
{
//lambda 方式删除符合条件的对象
observer_list.remove_if([=](IObserver* it) {
if (item->GetName() == it->GetName())
{
cout <<"remove "<< it->GetName() << endl;
return true;
}
return false;
});
}
//通知
void Notify()
{
for(auto item : observer_list)
{
item->Update();
}
}
protected:
list<IObserver*> observer_list;
};
//老板属于消息的发布者
class Boss :public Subject
{
};
//员工继承观察者
class Staff :public IObserver
{
public:
Staff(string name):Name(name)
{
}
void Update() override
{
cout << "Name= " << Name << ",老板来了!" <<endl;
}
string GetName() override
{
return Name;
}
protected:
string Name;
};
void TestStaff()
{
Subject* boss = new Boss();
IObserver* S = new Staff("小明");
IObserver* S2 = new Staff("小墙");
boss->Attach(S);
boss->Attach(S2);
boss->Notify();
boss->Detach(S);
}