• 观察者模式(Observer Pattern)


      1 #ifndef OBSERVER_H
      2 #define OBSERVER_H
      3 #include<list>
      4 #include<iostream>
      5 using namespace std;
      6 
      7 class Observer
      8 {
      9 public:
     10     virtual void update()=0;
     11 };
     12 
     13 class Subject
     14 {
     15 public:
     16     virtual void attach(Observer* observer)=0;
     17     virtual void detach(Observer* observer)=0;
     18     virtual void notify()=0;
     19 };
     20 
     21 class ConcreteSubject:public Subject
     22 {
     23 private:
     24     list<Observer*> _observers;
     25 
     26     int _state;
     27     
     28 public:
     29     ConcreteSubject():_state(0){
     30     }
     31 
     32     void attach(Observer* observer){
     33         _observers.push_front(observer);
     34     }
     35 
     36     void detach(Observer* observer){
     37         _observers.remove(observer);
     38     }
     39 
     40     void notify(){
     41         list<Observer*>::iterator it;
     42         for(it=_observers.begin();it!=_observers.end();++it){
     43             (*it)->update();
     44         }
     45     }
     46 
     47     int getState()const{
     48         return _state;
     49     }
     50 
     51     void setState(int newState){
     52         _state=newState;
     53 
     54         notify();
     55     }
     56 };
     57 
     58 class ConcreteObserverA:public Observer
     59 {
     60 private:
     61     Subject* _subject;
     62 public:
     63     ConcreteObserverA(Subject* subject){
     64         _subject=subject;
     65         _subject->attach(this);
     66     }
     67 
     68     void update(){
     69         ConcreteSubject* s=dynamic_cast<ConcreteSubject*>(_subject);
     70         cout<<"ConcreteObserverA\n------"<<endl;
     71         cout<<"update!\nThe new state is: "<<s->getState()<<endl<<endl;
     72     }
     73 };
     74 
     75 class ConcreteObserverB:public Observer
     76 {
     77 private:
     78     Subject* _subject;
     79 public:
     80     ConcreteObserverB(Subject* subject){
     81         _subject=subject;
     82         _subject->attach(this);
     83     }
     84 
     85     void update(){
     86         ConcreteSubject* s=dynamic_cast<ConcreteSubject*>(_subject);
     87         cout<<"ConcreteObserverB\n------"<<endl;
     88         cout<<"update!\nThe new state is: "<<s->getState()<<endl<<endl;
     89     }
     90 };
     91 
     92 class ConcreteObserverC:public Observer
     93 {
     94 private:
     95     Subject* _subject;
     96 public:
     97     ConcreteObserverC(Subject* subject){
     98         _subject=subject;
     99         _subject->attach(this);
    100     }
    101 
    102     void update(){
    103         ConcreteSubject* s=dynamic_cast<ConcreteSubject*>(_subject);
    104         cout<<"ConcreteObserverC\n------"<<endl;
    105         cout<<"update!\nThe new state is: "<<s->getState()<<endl<<endl;
    106     }
    107 };
    108 
    109 #endif//OBSERVER_H
    110 
    111 int main()
    112 {
    113     ConcreteSubject subject;
    114     ConcreteObserverA observerA(&subject);
    115     ConcreteObserverB observerB(&subject);
    116     ConcreteObserverC observerC(&subject);
    117 
    118     subject.notify();
    119 
    120     subject.setState(100);
    121 
    122 
    123 
    124      return 0;
    125 }
  • 相关阅读:
    接口测试——Java + TestNG 国家气象局接口(json解析)实例
    log4j2配置文件解读
    ReportNG报表显示中文乱码和TestNG显示中文乱码实力解决办法
    Jmeter脚本录制方法——手工编写脚本(jmeter与fiddler结合使用)
    SQL server学习(五)T-SQL编程之存储过程
    SQL server学习(四)T-SQL编程之事务、索引和视图
    Jmeter——关联(正则表达式)
    Jmeter脚本录制方法——Badboy录制&自带的代理服务器录制
    Jmeter——环境搭建
    SpringBoot系列之集成Dubbo示例教程
  • 原文地址:https://www.cnblogs.com/freewater/p/2559204.html
Copyright © 2020-2023  润新知