- 浏览: 761648 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新.
松耦合:两个对象松耦合时,它们依然可以交互,但并不太清楚彼此的细节,相互依赖很低,这样可以建立有弹性的OO系统,应对变化.
要点:
1.观察者模式定义了对象之间一对多的关系
2.主题用一个共同的接口来更新观察者
3.观察者和可观察者之间用松耦合结合,可观察者不知道观察者的细节,只知道观察者实现了
观察者接口
4.使用此模式时,你可从被观察者处推或拉数据(推的方式被认为更“正确”)
5.有多个观察者时,不可以依赖特定的通知次序
设计原则:为交互对象之间的松耦合设计而努力
主题接口:Subject.h
观察者接口:Observer.h
主题实例:
weatherData.h
weatherData.cpp
观察者实例:
CurrentTemperature.h
CurrentTemperature.cpp
松耦合:两个对象松耦合时,它们依然可以交互,但并不太清楚彼此的细节,相互依赖很低,这样可以建立有弹性的OO系统,应对变化.
要点:
1.观察者模式定义了对象之间一对多的关系
2.主题用一个共同的接口来更新观察者
3.观察者和可观察者之间用松耦合结合,可观察者不知道观察者的细节,只知道观察者实现了
观察者接口
4.使用此模式时,你可从被观察者处推或拉数据(推的方式被认为更“正确”)
5.有多个观察者时,不可以依赖特定的通知次序
设计原则:为交互对象之间的松耦合设计而努力
主题接口:Subject.h
#ifndef SUBJECT_H #define SUBJECT_H #include"Observer.h" class Subject{ public: virtual void registerObserver(Observer* obs)=0;//增加 virtual void removeObserver(Observer* obs)=0;//删除 virtual void notifyObserver()=0;//通知观察者准备更新 }; #endif // SUBJECT_H
观察者接口:Observer.h
#ifndef OBSERVER_H #define OBSERVER_H class Observer{ public: virtual void update(float t,float p=0,float=0)=0;//更新全部数据 virtual void update()=0;//只更新自己需要的数据 virtual void display()=0; }; #endif // OBSERVER_H
主题实例:
weatherData.h
#ifndef WEATHERDATA_H #define WEATHERDATA_H #include"Subject.h" #include<list> using namespace std; class WeatherData:public Subject{ private: list<Observer*> mObsList; float mTemperature; float mHumidity; float mPressure; bool mChange;//增加一个变量,以备不时之需,比如当数据发生微小变化时不改更新 public: explicit WeatherData(float t=0,float h=0,float p=0); void registerObserver(Observer* obs); void removeObserver(Observer* obs); void notifyObserver(); void setMeasurement(float t,float h,float p); void measurementChanged(); float getTemperature()const; float getHumidity()const; float getPressure()const; bool getChanged()const; void setChanged(bool c); }; #endif // WEATHERDATA_H
weatherData.cpp
#include"WeatherData.h" WeatherData::WeatherData(float t, float h, float p) :mTemperature(t),mHumidity(h),mPressure(p){ } void WeatherData::registerObserver(Observer *obs){ mObsList.push_back(obs); } void WeatherData::removeObserver(Observer *obs){ mObsList.remove(obs); } void WeatherData::notifyObserver(){ list<Observer*>::iterator iter = mObsList.begin(); while(iter!=mObsList.end()){ //(*iter)->update();//拉数据 (*iter)->update(mTemperature,mHumidity,mPressure);//推送数据 ++iter; } } /* TODO:这里可以利用change来灵活的更新信息 */ void WeatherData::setMeasurement(float t, float h, float p){ mTemperature = t; mHumidity = h; mPressure = p; measurementChanged(); } void WeatherData::measurementChanged(){ notifyObserver(); } void WeatherData::setChanged(bool c){ mChange = c; } bool WeatherData::getChanged()const{ return mChange; } /* 支持主动接收数据 */ float WeatherData::getTemperature()const{ return mTemperature; } float WeatherData::getHumidity()const{ return mHumidity; } float WeatherData::getPressure()const{ return mPressure; }
观察者实例:
CurrentTemperature.h
#ifndef CURRENTCONDITION_H #define CURRENTCONDITION_H #include"Observer.h" #include"Subject.h" class CurrentTemperature:public Observer{ private: float mTemperature; float mHumidity; float mPressure; Subject* mSub; public: explicit CurrentTemperature(Subject* sub); void update(float t,float h=0,float p=0); void update(); void display(); }; #endif
CurrentTemperature.cpp
#include"Observer.h" #include"CurrentTemperature.h" #include"WeatherData.h" #include<iostream> using namespace std; CurrentTemperature::CurrentTemperature(Subject* sub){ mSub = sub;//将Subject保存起来,为"拉"数据做准备 sub->registerObserver(this); } /* 我其实只要温度这一个数据,你干嘛把所有的信息都推送给我? 我直接根据自身需求去取数据多好. 有时候这很烦人,就好像3G用户喜欢把手机推送给关掉。 */ void CurrentTemperature::update(){ if(WeatherData *wd = dynamic_cast<WeatherData*>(mSub)){ update(wd->getTemperature()); } } /* 但是你在构造的时候保存了我的指针,这意味着你们可以进来大肆挖掘 我的数据,我不得不提供公开的getter(),但每次想得到的时候都来找我, 你需要从我这多次getXXX(),这样多麻烦,而且像Statistic和Forecast 他们可不想每次到我这拉数据,我直接把所有的数据都给你们都更新 了,这样大部分观察者还是满意的多好! -----------推送数据被认为更“正确"---------------- 这样松耦合,观察者不需要持有主题对象的指针, 就好像是“你不要找我拿信息,我会一有新信息就帮大家都更新!” */ void CurrentTemperature::update(float t, float h, float p){ mTemperature = t; mHumidity = h; mPressure = p; } void CurrentTemperature::display(){ cout << "current temperature is " << mTemperature; } int main(){ WeatherData* wd = new WeatherData; Observer* obs = new CurrentTemperature(wd); wd->setMeasurement(30,20,10); obs->display(); } current temperature is 30
发表评论
-
桥接模式(Bridge)
2014-09-26 15:34 813桥接模式:将抽象与实现解耦,使得两者可以独立地变化,抽象部分的 ... -
访问者模式(Visitor)
2014-08-03 13:59 830访问者模式(Visitor),表示一个作用于某对象结构中的各元 ... -
解释器模式(interpreter)
2014-08-03 13:55 673解释器模式(interpreter),给定一个语言,定义它的方 ... -
享元模式(Flyweight)
2014-08-02 09:31 632享元模式(Flyweight):运用共享技术有效地支持大量细粒 ... -
中介者模式(Mediator)
2014-08-02 09:26 441中介者模式(Mediator):用一个中介对象来封装一系列的对 ... -
职责链模式(Responsibility)
2014-07-31 20:36 582职责链模式(Chain of Responsibility): ... -
合成/聚合利用原则
2014-07-29 20:56 585合成/聚合利用原则:尽量使用合成/聚合,尽量不要使用类继承 ... -
组合模式(Composite)
2014-07-27 10:15 430组合模式(Composite):将对象组合成树形结构以表示'部 ... -
备忘录模式(Memento)
2014-07-26 09:09 558备忘录(Memento):在不破坏封装性的前提下,捕获一个对象 ... -
事件委托(delegate)
2014-07-23 20:53 592委托机制的本质就是调用成员函数的函数指针,实现回调 委托就是 ... -
建造者模式(Builder)
2014-07-23 20:45 561建造者模式(Builder):将一个复杂对象的构建与它的表示分 ... -
外观模式(facade)
2014-07-20 09:31 623外观模式(facade):为子系统中的一组接口提供一个一致的界 ... -
迪米特法则
2014-07-19 18:23 403迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发 ... -
原型模式
2014-07-16 20:34 508原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ... -
里氏代换
2014-07-12 09:43 333里氏代换:一个软件实体如果使用的是一个父类的话,那么一定适用于 ... -
依赖倒转
2014-07-12 09:39 390依赖倒转:抽象不应该依赖细节,细节应该依赖抽象,说白了就是针对 ... -
开放-封闭原则
2014-07-12 09:33 557开放-封闭原则:是说软件实体(类,模块,函数等等)应该可以扩展 ... -
单一职责
2014-07-12 09:26 554单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的 ... -
MVC
2011-07-21 17:32 1009MVC是一种复合模式,结合了观察者,策略模式和组合模式。 要 ... -
代理模式(Proxy)
2011-07-19 15:47 921代理模式:为另一个对象提供一个替身或占位符以控制这个对象的访问 ...
相关推荐
观察者 Observer 模式定义:在对象之间定义了一对多的依赖关系 这样一来 当一个对象改变状态时 依赖它的对象都会收到通知并自动跟新 Java已经提供了对观察者Observer模式的默认实现 Java对观察者模式的支持主要体现...
观察者模式(Observer)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C++中广泛应用,特别是在需要...
在观察者模式中,通常有两个主要角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它持有一个观察者列表,并负责通知这些观察者状态的变化。观察者是依赖主题的对象,当接收到主题的通知时,它们会...
观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...
观察者模式(Observer)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在软件开发中广泛应用于事件处理和实时...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...
5. **解耦合**:Observer模式通过定义一种松散耦合的关系,使得被观察者和观察者可以独立地进行工作。这提高了系统的可扩展性和可维护性。 在实际应用中,例如,当我们开发一个实时数据显示系统,可以将数据源作为...
观察者模式(Observer)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态变化时通知多个“观察”该对象的其他对象。这个模式在软件工程中扮演着重要角色,尤其是在事件驱动编程和发布/订阅系统中。...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...
观察者模式(Observer)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态变化时通知多个“观察”该对象的其他对象。这个模式在软件工程中广泛应用于事件驱动编程,例如用户界面组件的交互或者系统状态的...
观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...
**C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...
Observer观察者模式是一种...要深入了解Observer模式,你可以查看"src"目录下的代码,分析主题和观察者的实现,理解它们如何交互。同时,可以通过博文链接(已提供)来获取更多关于Observer模式的理论知识和实践指导。
观察者模式详解 观察者模式是23种设计模式中的一种,尤其是在软件设计过程中体现的更是立足无穷。本文将详细讲解观察者模式的概念和实现,通过代码注释来解释各个组件的作用。 一、观察者模式的定义 观察者模式是...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动编程或者...
观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...
#### .NET框架中的Observer模式 在.NET框架中,观察者模式通常通过事件(Event)机制来实现。事件机制提供了发布/订阅模型,使得对象间的耦合程度大大降低。在这个模型中: - **事件(Event)**:代表了一个可以被...