C++设计模式之观察者模式

Observer 模式应该可以说是应用最多、影响最广的模式之一,因为 Observer 的一个实例 Model/View/Control( MVC) 结构在系统开发架构设计中有着很重要的地位和意义, MVC实现了业务逻辑和表示层的解耦。在 MFC 中, Doc/View(文档视图结构)提供了实现 MVC 的框架结构。在 Java 阵容中, Struts 则提供和 MFC 中 Doc/View 结构类似的实现 MVC 的框架。另外 Java 语言本身就提供了 Observer 模式的实现接口。当然, MVC 只是 Observer 模式的一个实例。 Observer 模式要解决的问题为: 建立一个一( Subject)对多( Observer) 的依赖关系, 并且做到当“一” 变化的时候, 依赖这个“一”的多也能够同步改变。

在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。

适用场合

在以下任一情况下都可以使用观察者模式:

  1. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用;
  2. 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;
  3. 当一个对象必须通知其它对象,而它又不能假定其它对象是谁;也就是说,你不希望这些对象是紧密耦合的

代码实现:

 1 // Observer.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include<string>
 7 #include<list>
 8 using namespace std;
 9 
10 class Observer
11 {
12 public:
13     virtual void update(int i) = 0;
14 };
15 
16 class Subject
17 {
18 public:
19     virtual void Attach(Observer*) = 0;
20     virtual void Detach(Observer*) = 0;
21     virtual void Notify() = 0;
22 };
23 class ConcreteObserver:public Observer
24 {
25 public:
26     ConcreteObserver(Subject *pSubject):m_pSubject(pSubject){}
27     void update(int value)
28     {
29         cout << "ConcreteObserver get the update. New State:" << value << endl;
30     }
31 private:
32     Subject *m_pSubject;
33 };
34 class ConcreteObserver2:public Observer
35 {
36 public:
37     ConcreteObserver2(Subject *pSubject):m_pSubject(pSubject){}
38     void update(int value)
39     {
40         cout << "ConcreteObserver2 get the update. New State:" << value << endl;
41     }
42 private:
43     Subject *m_pSubject;
44 };
45 class ConcreteSubject:public Subject
46 {
47 public:
48     void Attach(Observer *pObserver)
49     {
50         m_Observerlist.push_back(pObserver);
51     }
52     void Detach(Observer *pObserver)
53     {
54         m_Observerlist.remove(pObserver);
55     }
56     void Notify()
57     {
58         std::list<Observer*>::iterator it = m_Observerlist.begin();
59         while(it != m_Observerlist.end())
60         {
61             (*it)->update(m_iState);
62             ++it;
63         }
64     }
65     void SetState(int state)
66     {
67         m_iState = state;
68     }
69 private:
70     std::list<Observer*> m_Observerlist;
71     int m_iState;
72 
73 
74 };
75 int _tmain(int argc, _TCHAR* argv[])
76 {
77     ConcreteSubject *pSubject = new ConcreteSubject();
78     ConcreteObserver *pObserver = new ConcreteObserver(pSubject);
79     ConcreteObserver2 *pObserver2 = new ConcreteObserver2(pSubject);
80     pSubject->SetState(2);
81     pSubject->Attach(pObserver);
82     pSubject->Attach(pObserver2);
83     pSubject->Notify();
84     pSubject->Detach(pObserver2);
85     pSubject->SetState(3);
86     pSubject->Notify();
87     delete pObserver;
88     delete pObserver2;
89     delete pSubject;
90     system("pause");
91     return 0;
92 }

猜你喜欢

转载自www.cnblogs.com/wxmwanggood/p/9285982.html