设计模式: 观察者模式

#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; } 
                   
                  
                 
                
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值