2026/2/11 21:06:51
网站建设
项目流程
广州网站制作公司优化,现在还有做网站的必要吗,网站建设文书,天津招投标天津建设工程信息网一.概念观察者设计模式属于行为型设计模式#xff0c;又称发布-订阅模式#xff0c;定义了对象间的一对多依赖关系#xff0c;被观察对象状态发生变化时#xff0c;所有订阅它的观察对象都会受到通知并自动更新。
二.原理
1.Subject(被观察者)
包含观察者对象的集合#x…一.概念观察者设计模式属于行为型设计模式又称发布-订阅模式定义了对象间的一对多依赖关系被观察对象状态发生变化时所有订阅它的观察对象都会受到通知并自动更新。二.原理1.Subject(被观察者)包含观察者对象的集合提供增加、删除、通知观察者对象的抽象接口。2.ConcreteSubject(具体的被观察者)Subject抽象类接口的具体实现维护观察者列表并将变化通知所有观察者。3.Observer观察者接收Subject通知的对象订阅Subject的状态并提供更新操作的统一抽象接口。4.ConcreteObserver(具体的观察者)Observer抽象类接口的具体实现提供了更新操作的具体实现收到subject通知后进行更新操作。三.特点1.优势符合开闭原则的要求。支持广播的通信方式。动态添加观察者代码扩展性好。2.劣势每次状态变化都要遍历所有观察者性能开销大。每次状态变化都要通知所有观察者通信时间长。观察者数量过多使代码的可读性变差。四.代码实现1.demo1-传参通知#includeiostream#includevectorusingnamespacestd;//抽象类classObserver{public:virtualvoidupdate(intdata)0;//纯虚函数};classConcreteObserver:publicObserver{public:ConcreteObserver(string name){m_sNamename;}voidupdate(intdata){coutm_sName received data:dataendl;}private:string m_sName;};classSubject{public:virtualvoidattach(Observer*observer)0;virtualvoiddetach(Observer*observer)0;virtualvoidnotify(intdata)0;};classConcreteSubject:publicSubject{public:voidattach(Observer*observer){observers.push_back(observer);}voiddetach(Observer*observer){for(autoitobservers.begin();it!observers.end();it){if(*itobserver){observers.erase(it);break;}}}voidnotify(intdata){for(autoitobservers.begin();it!observers.end();it){(*it)-update(data);}}private:vectorObserver*observers;};intmain(){coutobserver demo1!endl;ConcreteObserverobserver1(observer1);ConcreteObserverobserver2(observer2);ConcreteObserverobserver3(observer3);ConcreteSubject subject;subject.attach(observer1);subject.attach(observer2);subject.attach(observer3);subject.notify(10);subject.detach(observer1);subject.notify(20);return0;}2.demo2-模拟天气预报#includeiostream#includevectorusingnamespacestd;classObserver{public:virtualvoidupdate(floattemperature,floathumidity,floatpressure)0;};classDisplay:publicObserver{public:voidupdate(floattemperature,floathumidity,floatpressure){coutTemperature:temperature℃, Humidity:humidity%, Pressure:pressurehPaendl;}};classWeatherStation{private:floatm_fTemperature;floatm_fHumidity;floatm_fPressure;vectorObserver*m_vObservers;public:voidattach(Observer*observer){m_vObservers.push_back(observer);}voiddetach(Observer*observer){for(autoitm_vObservers.begin();it!m_vObservers.end();it){if(*itobserver){m_vObservers.erase(it);break;}}}voidnotify(){for(autoitm_vObservers.begin();it!m_vObservers.end();it){(*it)-update(m_fTemperature,m_fHumidity,m_fPressure);}}voidsetValue(floattemp,floathum,floatpress){m_fTemperaturetemp;m_fHumidityhum;m_fPressurepress;notify();}};intmain(){std::coutobserver demo2!std::endl;WeatherStation weatherStation;Display display1;Display display2;weatherStation.attach(display1);weatherStation.attach(display2);weatherStation.setValue(25.5,50,103);weatherStation.setValue(25.7,60,152);return0;}五.运行结果1.demo1-传参通知observer demo1!observer1 received data:10 observer2 received data:10 observer3 received data:10 observer2 received data:20 observer3 received data:202.demo2-模拟天气预报observer demo2!Temperature:25.5℃, Humidity:50%, Pressure:103hPa Temperature:25.5℃, Humidity:50%, Pressure:103hPa Temperature:25.7℃, Humidity:60%, Pressure:152hPa Temperature:25.7℃, Humidity:60%, Pressure:152hPa