• 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 }
  • 相关阅读:
    java 浅显的会议预约-没有测试过
    Postgresql 与 Spring的集成
    对象转JSON正则查找替换
    Java 对象与JSONString的互相转换
    excel 中涉及到金额显示0E-8的 可以使用以下语句来把excel导出修改为0
    Java 非正则方式校验数据
    泛型与反射的使用
    正则表达式,匹配 URL 是IP还是域名
    对外接口加密
    自定义SQL查询的使用
  • 原文地址:https://www.cnblogs.com/wxmwanggood/p/9285982.html
Copyright © 2020-2023  润新知