Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1074255
  • 博文数量: 77
  • 博客积分: 821
  • 博客等级: 军士长
  • 技术积分: 1905
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-23 16:17
个人简介

学校:上海交通大学软件工程 学历:硕士 行业:从事流媒体移动开发 QQ: 412595942 邮箱:yiikai1987910@gmail.com

文章分类

全部博文(77)

文章存档

2016年(4)

2015年(15)

2014年(16)

2013年(12)

2012年(21)

2011年(9)

分类: C/C++

2014-02-12 17:39:26

     定义对象间的一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己。

    观察者模式所做的工作其实就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。

本模式是依赖倒置原则的最佳体现!

    设计原则:为了交互对象之间的松耦合设计而奋斗到底!
   从上不难发现,对于观察者的使用,可以很好的解除类与类之间的耦合关系,通过抽象类进行注册,从而实现了面对接口编程的设计理念。
   举个观察者模式的例子:
   现在你可以想象,你是你一个老板,但是呢你不但有你的老婆,而且还有你的小三。没到情人节,你都需要对他们发送爱的信息,这时候如果分别发送明显很不方便,现在你只有一个小三,如果有好几个呢?这时候观察者模式就能完成你一次完成发送的愿望,只需要将他们都注册到你的发送对象中,每次你发送都会随时的通知他们
   你的发送消息的类:
   

点击(此处)折叠或打开

  1. class subject
  2. {
  3. public:
  4.     subject();
  5.     ~subject();

  6.     void registListener(listener* tmplistener);
  7.     void removeListener(listener* tmplistener);
  8.     void notify();
  9. private:
  10.     std::list<listener*> m_listenerlist;
  11. };
      可以发现这时候你就可以用这个类将小三老婆都注册进来了

点击(此处)折叠或打开

  1. subject::subject()
  2. {

  3. }

  4. subject::~subject()
  5. {

  6. }

  7. void subject::registListener(listener* tmplistener)
  8. {
  9.     m_listenerlist.push_back(tmplistener);
  10. }
  11.     
  12. void subject::removeListener(listener* tmplistener)
  13. {
  14.     m_listenerlist.remove(tmplistener);
  15. }

  16. void subject::notify()
  17. {
  18.     std::list<listener*>::iterator itr = m_listenerlist.begin();
  19.     for(;itr != m_listenerlist.end();itr++)
  20.     {
  21.         (*itr)->update();
  22.     }
  23. }
儿小三类都是继承于基类listerner的,为什么要抽象出这么个类呢?(想想针对接口编程的思想)

点击(此处)折叠或打开

  1. class listener
  2. {
  3. public:
  4.     listener();
  5.     ~listener();
  6.     
  7.     

  8.     virtual void update() = 0;
  9. };




小三就是来实现update这个接口的

点击(此处)折叠或打开

  1. xiaosan::xiaosan()
  2. {

  3. }

  4. xiaosan::~xiaosan()
  5. {
  6. }

  7. void xiaosan::update()
  8. {
  9.     printf("xiaosan get notify\n");
  10. }
老婆类似

现在上主程序

点击(此处)折叠或打开

  1. subject msubject;
  2.     xiaosan mxiaosan;
  3.     laopo mlaopo;
  4.     msubject.registListener(&mxiaosan);
  5.     msubject.registListener(&mlaopo);
  6.     msubject.notify();

  7.     msubject.removeListener(&mxiaosan);
  8.     msubject.removeListener(&mlaopo);
  9.     msubject.notify();

  10.     system("pause");


阅读(4926) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~