网站官网建设企业,网站开发使用哪种语言,sketch代替ps做网站,服装集团网站建设系列文章目录
C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列
期待你的关注哦#xff01;#xff01;#xff01;
现在的一切都是为将来的梦想编织翅膀#xff0c;让梦想在现实中展翅高飞。 Now everythi…系列文章目录
C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列
期待你的关注哦
现在的一切都是为将来的梦想编织翅膀让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 行为型设计模式之观察者模式 系列文章目录一、观察者模式介绍二、观察者模式优缺点2.1 优点2.2 缺点 三、观察者模式使用场景四、观察者模式实现4.1 示例1 - 代码实现4.1 示例2 - 代码实现 一、观察者模式介绍
⚠️ 意图 定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。
⚠️ 主要解决 一个对象状态改变给其他对象通知的问题而且要考虑到易用和低耦合保证高度的协作。
⚠️ 何时使用 一个对象目标对象的状态发生改变所有的依赖对象观察者对象都将得到通知进行广播通知。
⚠️ 如何解决 使用面向对象技术可以将这种依赖关系弱化。
观察者模式Observer又叫发布-订阅模式Publish/Subscribe定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都要得到通知并自动更新。
观察者模式从根本上讲必须包含两个角色观察者和被观察对象。
被观察对象自身应该包含一个容器来存放观察者对象当被观察者自身发生改变时通知容器内所有的观察者对象自动更新。
观察者对象可以注册到被观察者的中完成注册后可以检测被观察者的变化接收被观察者的通知。当然观察者也可以被注销掉停止对被观察者的监控。 图1_1 观察者模式类图 二、观察者模式优缺点
2.1 优点 观察者和被观察者是抽象耦合的。 建立一套触发机制。
2.2 缺点 如果一个被观察者对象有很多的直接和间接的观察者的话将所有的观察者都通知到会花费很多时间。 如果在观察者和观察目标之间有循环依赖的话观察目标会触发它们之间进行循环调用可能导致系统崩溃。 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的而仅仅只是知道观察目标发生了变化。
三、观察者模式使用场景 当一个抽象模型有两个方面其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用 当对一个对象的改变需要同时改变其它对象而不知道具体有多少对象有待改变 当一个对象必须通知其它对象而它又不能假定其它对象是谁也就是说你不希望这些对象是紧密耦合的。
四、观察者模式实现
4.1 示例1 - 代码实现
这里的目标 Subject 提供依赖于它的观察者 Observer 的注册 Attach 和注销 Detach操作并且提供了使得依赖于它的所有观察者同步的操作 Notify。 观察者 Observer 则提供一个 Update 操作 注意这里的 Observer 的 Update 操作并不在 Observer 改变了 Subject 目标状态的时候就对自己进行更新 这个更新操作要延迟到 Subject 对象发出 Notify 通知所有Observer 进行修改调用 Update。
#include iostream
#include string
#include list
using namespace std;class Subject;
//抽象观察者
class Observer
{
protected:string name;Subject *sub;
public:Observer(string name, Subject *sub){this-name name;this-sub sub;}virtual void update() 0;
};
//具体的观察者看股票的
class StockObserver :public Observer
{
public:StockObserver(string name, Subject *sub) :Observer(name, sub){}void update();
};
//具体的观察者看NBA的
class NBAObserver :public Observer
{
public:NBAObserver(string name, Subject *sub) :Observer(name, sub){}void update();
};
//抽象通知者
class Subject
{
protected:listObserver* observers;
public:string action;virtual void attach(Observer*) 0;virtual void detach(Observer*) 0;virtual void notify() 0;
};
//具体通知者秘书
class Secretary :public Subject
{void attach(Observer *observer){observers.push_back(observer);}void detach(Observer *observer){listObserver *::iterator iter observers.begin();while (iter ! observers.end()){if ((*iter) observer){observers.erase(iter);}iter;}}void notify(){listObserver *::iterator iter observers.begin();while (iter ! observers.end()){(*iter)-update();iter;}}
};void StockObserver::update()
{cout name 收到消息 sub-action endl;if (sub-action 梁所长来了!){cout 我马上关闭股票装做很认真工作的样子 endl;}
}void NBAObserver::update()
{cout name 收到消息 sub-action endl;if (sub-action 梁所长来了!){cout 我马上关闭NBA装做很认真工作的样子 endl;}
}int main()
{Subject *dwq new Secretary(); //创建观察者br //被观察的对象Observer *xs new NBAObserver(xiaoshuai, dwq);Observer *zy new NBAObserver(zouyue, dwq);Observer *lm new StockObserver(limin, dwq);//加入观察队列dwq-attach(xs);dwq-attach(zy);dwq-attach(lm);//事件dwq-action 去吃饭了;br //通知dwq-notify();cout endl;dwq-action 梁所长来了!;dwq-notify();return 0;
}4.1 示例2 - 代码实现
#include iostream
#include list
using namespace std;class Observer
{
public:virtual void Update(int) 0;
};class Subject
{
public:virtual void Attach(Observer *) 0;virtual void Detach(Observer *) 0;virtual void Notify() 0;
};class ConcreteObserver : public Observer
{
public:ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){}void Update(int value){cout ConcreteObserver get the update. New State: value endl;}private:Subject *m_pSubject;
};class ConcreteObserver2 : public Observer
{
public:ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){}void Update(int value){cout ConcreteObserver2 get the update. New State: value endl;}private:Subject *m_pSubject;
};class ConcreteSubject : public Subject
{
public:void Attach(Observer *pObserver);void Detach(Observer *pObserver);void Notify();void SetState(int state){m_iState state;}private:std::listObserver * m_ObserverList;int m_iState;
};void ConcreteSubject::Attach(Observer *pObserver)
{m_ObserverList.push_back(pObserver);
}void ConcreteSubject::Detach(Observer *pObserver)
{m_ObserverList.remove(pObserver);
}void ConcreteSubject::Notify()
{std::listObserver *::iterator it m_ObserverList.begin();while (it ! m_ObserverList.end()){(*it)-Update(m_iState);it;}
}int main()
{// Create SubjectConcreteSubject *pSubject new ConcreteSubject();// Create ObserverObserver *pObserver new ConcreteObserver(pSubject);Observer *pObserver2 new ConcreteObserver2(pSubject);// Change the statepSubject-SetState(2);// Register the observerpSubject-Attach(pObserver);pSubject-Attach(pObserver2);pSubject-Notify();// Unregister the observerpSubject-Detach(pObserver);pSubject-SetState(3);pSubject-Notify();delete pObserver;delete pObserver2;delete pSubject;
}