<<向左走,向右走>>曾经骗去了我无数的眼泪.一首<<遇见>>更是改变了我人生的轨迹.虽然此篇只是技术文章,但借此也缅怀那段颓废的日子: 向左走,向右走

Observer核心思想在于订阅--发布.

比方说 有次外出公干,住在一宾馆内,事情很忙,没空外出观光,在房间里拼命赶Demo.突然发现有些测试资料不全,落在公司了,于是赶紧给同事打电话叫其快递过来.第二天事情仍然很多,但因为那份邮件的资料很重要,于是每隔一小段时间就去宾馆前台询问我的快递是否到了,这样严重打扰了我手头的事情,而且前台小妞也不高兴了, 她说这样吧你在我这里登记下你的房间号,等你快递到了我会帮你送过来的. 于是我就登记了一下, 回去忙着干自个的事了.也不知道过了多久,门铃响了,服务员客气的递给我一个包裹,快递终于来了,于是我放下手头的事情赶紧去测试那些未测的资料. (故事编的不好,见笑)

那么在这个故事里有几个要点: 1."我就登记了一下" 是一个订阅,登记的过程.2."门铃响了" 消息通知. 3."我放下手头的事情赶紧去测试那些未测的资料" 响应此事件 4.前台接到快递公司发给我的快递, 事件被触发.显然,前台如果收到的是别人的快递,是不会送给我的,意思就是说,我只关系我的邮件有没有到,我登记的主题只是"我的邮件到了",如果收到的是别人的邮件请不要来打扰我.

Observer模式详细可以参考下 吕震宇 : 设计模式(19)-Observer Pattern

Mediator核心思想是使本来一群关系错综复杂的群体,通过引入一个中间人,把原来成网状的关系梳理成星形结构

      -------------->>       

曾经在读<<敏捷软件开发>>时候产生过关于Mediator和Observer的疑问:关于Mediator模式的疑惑--<<敏捷软件开发>>读书笔记系列

我们知道在C#里大家在提到Observer模式的时候,经常提到用Event可以简化实现Observer,事件也阐述的是一个订阅--发布的理念.这几天回过头来看我的那篇blog,有了些新的认识, 愚以为用Event的方式更像是Mediator模式.

Observer模式 和 Mediator模式都是用来传递消息的,但他们实现的手段是不一样的."显而易见"的是,Mediator模式中需要通过Mediator转发,所以Colleague要依赖于Mediator.然而在<<敏捷>>一书中Bob大叔明确指出Colleague并不一定要知道Mediator的存在.此事曾令我费解.

<<敏捷>>一书Mediator C#版
 public class QuickEntryMediator
 {
     private TextBox m_txtBox = null;
     private ListBox m_listBox = null;

     public QuickEntryMediator(TextBox textBox, ListBox listBox)
     {
         m_txtBox = textBox;
         m_listBox = listBox;
         m_txtBox.TextChanged += new EventHandler(OnTextChanged);
     }

     void OnTextChanged(object sender, EventArgs e)
     {
         string text = m_txtBox.Text;
         // highlight list items which prefix equal to text
     }
 }

Google了一些资料,想看看究竟Observer模式 和 Mediator模式本质的区别在哪里?

也重新看了一下<<Java于模式>>得到了一些启示,原话: 调停者模式与观察者模式是功能相类似的设计....观察者模式通过引入观察者对象和主题对象来达到将通信分散化的目的;而调停者模式则是封装了对象之间的通信,从而将通信集中在一个个中介对象中.

反复看了这段话得出的区别就是: 集中VS分散. Observer模式中观察者要跑去主题对象中注册,如果关注多个主题,均需要去各自的主题对象中注册.而Mediator模式Colleague各自间的关系是由Mediator组织的.从这个切入点去区别,我基本想通了为什么Bob大叔举的例子属于Mediator模式.

因为在这里QuickEntryMediator把Textbox,跟ListBox关联在一起,ListBox根本不知道TextBox的存在,信息都集中处理在QuickEntryMediator里.

按照我刚才的理解,确实吕震宇那篇文章中"C#中的Delegate与Event"一节中举的例子还有点Observer模式的味道,请注意看其是怎么实现的:

吕震宇的Observer delegate的实现
 ConcreteSubject s = new ConcreteSubject();
    ConcreteObserver o1 = new ConcreteObserver(s, "1");
    s.Attach(new UpdateDelegate(o1.Update));

然而实际上我们在使用Event的时候并不是这样,更多的情况是像Bob大叔举的例子那样使用.
在TerryLee .NET设计模式(19):观察者模式(Observer Pattern)


  static void Main(string[] args)
    {
        Stock stock = new Stock("Microsoft", 120.00);

        Investor investor = new Investor("Jom");

        stock.NotifyEvent += new NotifyEventHandler(investor.SendData);

        stock.Update();

        Console.ReadLine();
    }

此种方式是我们一般使用Event的方式,其天平已经偏向于Mediator模式了,只不过在这里由client负责组装他们的关系,(充当Mediator?可以这么理解吧)就如我上面阐述的一样,不知你是怎么认为的呢?

向信息集中走,向信息分散走

(PS:此文仅在于模式探讨,实际上用Event通知消息属于何种模式并不重要,纯粹理论上的较真,欢迎拍砖!)

转载于:https://www.cnblogs.com/anders06/archive/2007/07/17/821483.html

[DP思考录]向左走,向右走: Observer模式 VS Mediator模式相关推荐

  1. DELL 向左走 向右走?(二)

    未来戴尔会开更多的店吗,会从仅仅展示的功能延伸到销售.服务的功能吗?答案是肯定的,但是在以速度和规模为竞争要素的IT界,戴尔现在的做法显然是满足不了竞争需要的.   局部改变直销模式,积极响应中间商和 ...

  2. 内外交困,直播商业化寡头博弈困境:向左或是向右走?

    2017年伊始,直播市场就好不热闹.先是2017年1月前后国家相关部门严查了"无证"及违规直播平台,高达9万个直播间被关闭,超过3万个主播账号被封禁--.接着2月份,随着光圈直播倒 ...

  3. 【 C 】对左值与右值的一些个人思考

    今天重温C语言的指针,看的书是<C和指针>,关于左值和右值以及指针表达式的内容看得甚是迷惑与煎熬,怎么会这么难理解,指针表达式又是作为左值又一会作为右值,而且二者有着不一样的含义,为什么当 ...

  4. 请编写一个函数,计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和向下走,不能往左和往上走。

    请编写一个函数,计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和向下走,不能往左和往上走. 递归实现: # ...

  5. 【转】Linux那些事儿 之 戏说USB(21)向左走,向右走

    他们彼此深信,是瞬间迸发的热情,让他们相遇: 这样的确定是美丽的,但变幻无常更为美丽: 他们素未谋面,所以他们确定,彼此并无任何瓜葛, 但是自街道.楼梯.大堂传来的话语, 他们也许擦肩而过一百万次了吧 ...

  6. 一见钟情——[波兰]辛波丝卡--向左走,向右走中的那首波兰诗。

    <向左走,向右走>中的那首波兰诗. 一见钟情--[波兰]辛波丝卡 他们彼此深信 是瞬间迸发的热情让他们相遇. 这样的确定是美丽的, 但变幻无常更为美丽. 既然素未谋面, 所以他们确定彼此并 ...

  7. 移动语义引发的思考之左值、右值

    C++11最广泛的特性是移动语义,移动语义的基础在于区分左值表达式和右值表达式.一般来说,一个对象是右值意味着可以对其实施移动语义,而左值不可以.右值对应的是函数返回的临时对象,而左值对应的是可指涉的 ...

  8. 2022年,小家电向左or向右?

    早上醒来,几片面包片配上一杯咖啡就是一顿饱腹早餐:中午用空气炸锅煎好鸡胸肉,和一杯破壁机打好的鲜榨蔬菜汁:晚上打开电炖锅煮锅养生粥,同时扫地机器人开始自动清扫房间...... 众多品牌铺天盖地的宣传里 ...

  9. 【杂谈】野生在左 科班在右——数据结构学习誓师贴

    [杂谈]野生在左 科班在右--数据结构学习誓师贴 一. 科班 Vs 野生 这个老生常谈的问题让很多野生码农觉得不公平,在一次次面试中因为学历和那些工作中根本就用不到的知识虐的一脸懵逼,然后除了抱怨什么 ...

最新文章

  1. vanpopup 高度_解决VantUI popup 弹窗不弹出或无蒙层的问题
  2. 时间就是金钱!Windows 上必装的 10 款高效软件
  3. 字节流转化为文件流_C#文件转换为字节流及字节流转换为文件
  4. 只用一套解决方案,就可解决80%的交通物流行业信息难题
  5. css里slidebottom,jquery - 从CSS“top”到“bottom”的jQuery动画 - 堆栈内存溢出
  6. mysql备份之lvm
  7. neo4j python可视化_Python使用py2neo操作图数据库neo4j的方法详解
  8. 怎么根据错误弹窗 判断进程_苹果手机弹窗bug是什么情况?苹果手机为什么会出现弹窗bug要怎么解决?...
  9. 只有程序员才能读懂的西游记(不看后悔一生)
  10. 2021年“上海区块链周”参会随感(二)2021-04-12
  11. 测试POST传输工具【poster】。
  12. R语言画图,根据正负值画不同颜色,并且画水平线或者垂直线
  13. android引导页大小,Android:启动引导页实现
  14. 励步启蒙 android平板,励步启蒙官方版app
  15. Python做一个简单的名片管理系统
  16. ORA-01507: ??????
  17. 第三章:电子商务平台选择
  18. 阿里云无影云电脑ubantu中文失败解决方案
  19. J2ME学习之Nokia系列手机介绍—S40、S60和S90系列
  20. BuddyPress

热门文章

  1. android源码编译jar,在android源码编译中导入第三方jar包
  2. 基于python实现遗传算法
  3. 计算机组成原理写一个运算器,计算机组成原理运算器的实现实验报告.doc
  4. tensorflow英语怎么读_英语不行?你可以试试TensorFlow官方中文版教程
  5. java如何画百分比圆环_canvas绘制旋转的圆环百分比进度条
  6. Python机器学习:SVM003Soft Margin和SVM(线性)的正则化
  7. 管家婆辉煌2虚拟服务器,管家婆辉煌:三步轻松完成软狗组网!
  8. 易语言写组合框内容MySQL_易语言组合框赋值的几种方法
  9. Java 设计模式之 State 状态模式
  10. Mac 上无法使用netstat的-p参数