zoukankan      html  css  js  c++  java
  • [行为型] 观察者模式

    观察者模式是一种经常使用的设计模式。在软件系统中对象并不是孤立存在的,一个对象行为的改变可能导致一个或者多个其他与之存在依赖关系的对象行为发生改变。使用一种触发的技术使得相互相关的对象发生相应的动作。

    意图:
      定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

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

    View Code
     1 #include <iostream>
    2 #include <string>
    3 #include <list>
    4 using namespace std;
    5 // 观察者模式
    6
    7 //
    8 class CMyObserver // 观察者抽象类
    9 {
    10 public:
    11 CMyObserver() {}
    12 virtual ~CMyObserver() {}
    13 virtual void response() = 0;
    14 };
    15
    16 class CMySubject // 被观察者类
    17 {
    18 private:
    19 list<CMyObserver *> m_lstObserver;
    20 public:
    21 void attach(CMyObserver & ob)
    22 {
    23 m_lstObserver.push_back(&ob);
    24 }
    25
    26 void Detach(CMyObserver & ob)
    27 {
    28 // m_lstObserver.remove(*ob);
    29 }
    30 void Notify() // 被观察者通知观察者发生行为改变
    31 {
    32 cout << "猫叫!" << endl;
    33 CMyObserver *ob;
    34 for(list<CMyObserver *>::iterator ix = m_lstObserver.begin();ix != m_lstObserver.end();ix++)
    35 {
    36 ob = *ix;
    37 ob->response();
    38 }
    39 }
    40 };
    41
    42 class CMouse : public CMyObserver // 具体观察者类 老鼠
    43 {
    44 public:
    45 CMouse() {}
    46 ~CMouse() {}
    47 virtual void response()
    48 {
    49 cout << "老鼠努力逃跑" << endl;
    50 }
    51 };
    52
    53 class CDog : public CMyObserver // 具体观察者类 狗
    54 {
    55 public:
    56 CDog() {}
    57 ~CDog() {}
    58 virtual void response()
    59 {
    60 cout << "狗跟着叫" << endl;
    61 }
    62 };
    63 void main()
    64 {
    65 CMySubject cat;
    66 CMyObserver *o1,*o2;
    67 o1 = new CMouse;
    68 o2 = new CDog;
    69 cat.attach(*o1);
    70 cat.attach(*o2);
    71 cat.Notify(); // 当猫叫时,老鼠会跑,狗也会叫
    72
    73 delete o1;
    74 delete o2;
    75
    76 }
  • 相关阅读:
    android Json解析详解
    Android 用ping的方法判断当前网络是否可用
    Android 监控网络状态
    Android TableLayout 常用的属性介绍及演示
    三星笔记本R428安装xp win7双系统,切换系统重启才能进入系统解决办法。
    解决Win8不能上网攻略第二版!三步秒杀原驱动
    Android三种实现自定义ProgressBar的方式介绍
    Android应用开发中半透明效果实现方案
    FFT算法的物理意义
    网络编程Socket之TCP之close/shutdown具体解释(续)
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2404393.html
Copyright © 2011-2022 走看看