【深度好文】大模型智能体开发全攻略:64张图解析14项关键技术,小白也能轻松掌握
2026/1/16 17:00:44
观察者设计模式属于行为型设计模式,又称发布-订阅模式,定义了对象间的一对多依赖关系,被观察对象状态发生变化时,所有订阅它的观察对象都会受到通知并自动更新。
包含观察者对象的集合,提供增加、删除、通知观察者对象的抽象接口。
Subject抽象类接口的具体实现,维护观察者列表,并将变化通知所有观察者。
接收Subject通知的对象,订阅Subject的状态,并提供更新操作的统一抽象接口。
Observer抽象类接口的具体实现,提供了更新操作的具体实现,收到subject通知后进行更新操作。
#include<iostream>#include<vector>usingnamespacestd;//抽象类classObserver{public:virtualvoidupdate(intdata)=0;//纯虚函数};classConcreteObserver:publicObserver{public:ConcreteObserver(string name){m_sName=name;}voidupdate(intdata){cout<<m_sName<<" received data:"<<data<<endl;}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(autoit=observers.begin();it!=observers.end();it++){if(*it==observer){observers.erase(it);break;}}}voidnotify(intdata){for(autoit=observers.begin();it!=observers.end();it++){(*it)->update(data);}}private:vector<Observer*>observers;};intmain(){cout<<"observer 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;}#include<iostream>#include<vector>usingnamespacestd;classObserver{public:virtualvoidupdate(floattemperature,floathumidity,floatpressure)=0;};classDisplay:publicObserver{public:voidupdate(floattemperature,floathumidity,floatpressure){cout<<"Temperature:"<<temperature<<"℃, Humidity:"<<humidity<<"%, Pressure:"<<pressure<<"hPa"<<endl;}};classWeatherStation{private:floatm_fTemperature;floatm_fHumidity;floatm_fPressure;vector<Observer*>m_vObservers;public:voidattach(Observer*observer){m_vObservers.push_back(observer);}voiddetach(Observer*observer){for(autoit=m_vObservers.begin();it!=m_vObservers.end();it++){if(*it==observer){m_vObservers.erase(it);break;}}}voidnotify(){for(autoit=m_vObservers.begin();it!=m_vObservers.end();it++){(*it)->update(m_fTemperature,m_fHumidity,m_fPressure);}}voidsetValue(floattemp,floathum,floatpress){m_fTemperature=temp;m_fHumidity=hum;m_fPressure=press;notify();}};intmain(){std::cout<<"observer 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;}observer demo1!observer1 received data:10 observer2 received data:10 observer3 received data:10 observer2 received data:20 observer3 received data:20observer 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