观察者模式.docVIP

  • 4
  • 0
  • 约5.05千字
  • 约 7页
  • 2017-02-08 发布于重庆
  • 举报
观察者模式

Observer观察者模式 作用:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己 UML图: Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或者一个借口实现。它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个借口,可以增加和删除观察者对象。 Observer类,抽象观察者,为所有的具体观察者定义一个借口,在得到主题的通知时更新自己。这个借口叫做更新接口。抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个Update()方法。 ConcreteSubject类,叫做具体主题或具体通知者,将有关状态存入具体通知者对象;在具体主题的内部状态改变时,给所有等级过的观察者发出通知。通常用一个具体子类实现。 ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向一个具体主题对象的引用。 特点:将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。 何时使用: 当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。 观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。 代码如下: Observer.h 1 #ifndef _OBSERVER_H_ 2 #define _OBSERVER_H_ 3 4 #include string 5 #include list 6 using namespace std; 7 8 class Subject; 9 10 class Observer 11 { 12 public: 13 ~Observer(); 14 virtual void Update(Subject*)=0; 15 protected: 16 Observer(); 17 private: 18 }; 19 20 class ConcreteObserverA : public Observer 21 { 22 public: 23 ConcreteObserverA(); 24 ~ConcreteObserverA(); 25 virtual void Update(Subject*); 26 protected: 27 private: 28 string m_state; 29 }; 30 31 class ConcreteObserverB : public Observer 32 { 33 public: 34 ConcreteObserverB(); 35 ~ConcreteObserverB(); 36 virtual void Update(Subject*); 37 protected: 38 private: 39 string m_state; 40 }; 41 42 class Subject 43 { 44 public: 45 ~Subject(); 46 virtual void Notify(); 47 virtual void Attach(Observer*); 48 virtual void Detach(Observer*); 49 virtual string GetState(); 50 virtual void SetState(string state); 51 protected: 52 Subject(); 53 private: 54 string m_state; 55 listObserver* m_lst; 56 }; 57 58 class ConcreteSubjectA : public Subject 59 { 60 public: 61 ConcreteSubjectA(); 62 ~ConcreteSubjectA(); 63 protected: 64 private: 65 }; 66 67 class ConcreteSubjectB : public Subject 68 { 69 public: 70 ConcreteSu

文档评论(0)

1亿VIP精品文档

相关文档