标签:main tac 控制台应用程序 基础 对象 oid doc mode str
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 // 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 }
标签:main tac 控制台应用程序 基础 对象 oid doc mode str
原文地址:https://www.cnblogs.com/wxmwanggood/p/9285982.html