#include
#include
#include
using namespace std;
class Observer
{
friend class weather_data;
public:
Observer (size_t ID_) :ID (ID_) {}
virtual ~Observer () = default;
protected:
size_t ID;
virtual void update (double, double) {};
};
class Subject
{
public:
virtual ~Subject () = default;
virtual void register_observer (shared_ptr
o) = 0;
virtual void remove_observer (shared_ptr
o) = 0; virtual void notify_obsevers () = 0; }; struct display_element { virtual ~display_element () = default; virtual void display () = 0; }; class current_conditions_display : public Observer, public display_element { public: current_conditions_display () = default; current_conditions_display (shared_ptr
weather_data_, size_t ID_) : Observer(ID_), weather_data (weather_data_) { weather_data->register_observer (make_shared
(ID)); } void update (double temperature_, double humidity_)override { temperature = temperature_; humidity = humidity_; display (); } void display ()override { cout << "Current conditions: " << temperature << "째C degrees and " << humidity << "% humidity" << endl; } private: double temperature, humidity; shared_ptr
weather_data; }; class weather_data: public Subject { public: weather_data () : observers (set
> ()), temperature(0), humidity(0) {} void register_observer (shared_ptr
o)override { observers.insert (o); } void remove_observer (shared_ptr
o)override { auto loc = observers.find(o); if(loc != observers.cend()) observers.erase (o); } void notify_obsevers ()override { for (const auto &observer : observers) { observer->update (temperature, humidity); } } void set_mesurement (double temperature_, double humidity_) { temperature = temperature_; humidity = humidity_; notify_observers(); } private: double temperature, humidity; set
> observers; }; void test () { weather_data wd; current_conditions_display current_display (make_shared
(wd), 1); wd.register_observer (make_shared
(current_display)); wd.set_mesurement (12.5, 43.2); wd.notify_obsevers (); } int main () { ios::sync_with_stdio (false); test (); return 0; }
设计模式: 观察者模式
最新推荐文章于 2022-12-02 17:51:16 发布