zoukankan      html  css  js  c++  java
  • Observer 模式

    Observer模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望

    能够提供多种形式的表示 (例如以表格进行统计显示、 柱状图统计显示、 百分比统计显示等) 。这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变。Observer模式就是解决了这一个问题。

     1 /////////////Subject.h/////////////////////////////////////////////////////////////
     2 #pragma once 
     3 #include <string>
     4 #include <list>
     5 using namespace std;
     6 class Observer ;
     7 
     8 typedef string State ;
     9 class Subject
    10 {
    11 public:
    12     virtual ~Subject();
    13     virtual void Attach(Observer* obv);
    14     virtual void Detach(Observer* obv);
    15     virtual void Notify();
    16     virtual void SetState(const State& st) = 0 ;
    17     virtual State GetState() = 0 ;
    18 protected:
    19     Subject();
    20 
    21 private:
    22     list<Observer*>* _Obvs ;
    23 };
    24 
    25 class ConcreteSubject : public Subject
    26 {
    27 public:
    28     ~ConcreteSubject();
    29     ConcreteSubject();
    30     State GetState();
    31     void SetState(const State& st) ;
    32 protected:
    33 private:
    34     State _st ;
    35 };
     1 //////////////////Observer.h////////////////////////////////////////////////////////
     2 #pragma once
     3 #include <string>
     4 using namespace std;
     5 typedef string State ;
     6 class Subject ;
     7 
     8 class Observer
     9 {
    10 public:
    11     virtual ~Observer();
    12     virtual void Update(Subject* sub) = 0  ;
    13     virtual void PrintInfo() = 0;
    14     State _st ;
    15 protected:
    16     Observer();
    17     
    18 private:
    19 };
    20 
    21 
    22 class ConcreteObserverA : public Observer 
    23 {
    24 public:
    25     ~ConcreteObserverA();
    26     ConcreteObserverA(Subject* sub);
    27     virtual Subject* GetSubject();
    28     void Update(Subject* sub);
    29     void PrintInfo();
    30 protected:
    31 private:
    32     Subject* _sub ;
    33 };
    34 
    35 class ConcreteObserverB : public Observer 
    36 {
    37 public:
    38     ~ConcreteObserverB();
    39     ConcreteObserverB(Subject* sub);
    40     virtual Subject* GetSubject();
    41     void Update(Subject* sub);
    42     void PrintInfo();
    43 protected:
    44 private:
    45     Subject* _sub ;
    46 };
     1 ////////////Subject.cpp//////////////////////////////////////////////////////////////
     2 #include "Subject.h"
     3 #include "Observer.h"
     4 #include <list>
     5 typedef string State ;
     6 
     7 
     8 Subject::Subject()
     9 {
    10     _Obvs = new list<Observer*>();//在模板的使用之前一定要new
    11 }
    12 Subject::~Subject()
    13 {
    14 
    15 }
    16 
    17 void Subject::Attach(Observer* obv)
    18 {
    19     _Obvs->push_front(obv);
    20 }
    21 void Subject::Detach(Observer* obv)
    22 {
    23     if (obv != NULL)
    24     {
    25         _Obvs->remove(obv);
    26     }    
    27 }
    28 void Subject::Notify()
    29 {
    30     list<Observer*>::iterator it = _Obvs->begin();
    31     for (;it != _Obvs->end(); it++)
    32     {
    33         (*it)->Update(this);
    34     }
    35 }
    36 
    37 ConcreteSubject::~ConcreteSubject()
    38 {
    39 
    40 }
    41 ConcreteSubject::ConcreteSubject()
    42 {
    43     _st = '';
    44 }
    45 State ConcreteSubject::GetState()
    46 {
    47     return _st ;
    48 }
    49 void ConcreteSubject::SetState(const State& st)
    50 {
    51     _st = st ;
    52 }
     1 ////////////Observer.cpp//////////////////////////////////////////////////////////////
     2 #include "Observer.h"
     3 #include "Subject.h"
     4 #include <iostream>
     5 using namespace std ;
     6 Observer::Observer()
     7 {
     8     _st = '';
     9 }
    10 Observer::~Observer()
    11 {
    12 
    13 }
    14 
    15 ConcreteObserverA::ConcreteObserverA(Subject* sub)
    16 {
    17     _sub = sub ;
    18     _sub->Attach(this);
    19 }
    20 ConcreteObserverA::~ConcreteObserverA()
    21 {
    22     _sub->Detach(this);
    23     if (_sub != NULL)
    24     {
    25         delete _sub ;
    26     }
    27 }
    28 
    29 Subject* ConcreteObserverA::GetSubject()
    30 {
    31     return _sub ;
    32 }
    33  void ConcreteObserverA::PrintInfo()
    34 {
    35     cout<<"观察者A的到的通知:"<<_sub->GetState()<<endl;
    36 }
    37 
    38 void ConcreteObserverA::Update(Subject* sub)
    39 {
    40     _st = sub->GetState();
    41     PrintInfo();
    42 }
    43 
    44 
    45 ConcreteObserverB::ConcreteObserverB(Subject* sub)
    46 {
    47     _sub = sub ;
    48     _sub->Attach(this);
    49 }
    50 ConcreteObserverB::~ConcreteObserverB()
    51 {
    52     _sub->Detach(this);
    53     if (_sub != NULL)
    54     {
    55         delete _sub;
    56     }
    57 }
    58 Subject* ConcreteObserverB::GetSubject()
    59 {
    60     return _sub ;
    61 }
    62 
    63 void ConcreteObserverB::PrintInfo()
    64 {
    65     cout<<"观察者B的到的通知:"<<_sub->GetState()<<endl;
    66 }
    67 void ConcreteObserverB::Update(Subject* sub)
    68 {
    69     _st = sub->GetState();
    70     PrintInfo();
    71 }
     1 /////////////main.cpp/////////////////////////////////////////////////////////////
     2 #include "Subject.h"
     3 #include "Observer.h"
     4 #include <iostream>
     5 using namespace std;
     6 
     7 int main()
     8 {
     9     Subject* sub = new ConcreteSubject();
    10     Observer* o1 = new ConcreteObserverA(sub);
    11     Observer* o2 = new ConcreteObserverB(sub);
    12     
    13     sub->SetState("你获得一封邮件!");
    14     sub->Notify();
    15     sub->SetState("你的评论有新的回复!");
    16     sub->Notify();
    17 
    18 
    19     getchar();
    20     return 0 ;
    21 }
  • 相关阅读:
    一点一点学习GIt
    17-ajax向后端提交POST请求
    16-djongo中间件学习
    ES6快速入门
    15 Django组件——中间件
    导入Scrapy 项目报错:no module named scrapy
    slf4j + logback 输出日志:mybatis sql语句
    java实现链表
    Log4j2.xml的日志设置
    java多线程之生产者消费者经典问题
  • 原文地址:https://www.cnblogs.com/csxcode/p/3755935.html
Copyright © 2011-2022 走看看