如何区分javascript设计模式中的中介者模式(Mediator Pattern)与观察者模式(Observer Pattern)?
来源:互联网 发布:windows 设置字符集 编辑:程序博客网 时间:2024/06/05 17:00
首先聊聊观察者模式(Observer Pattern),这个非常好理解
在GoF的原文中是这样描述观察者模式的:
这个列表就叫做ObserverList,它有一些维护列表方法:
而我们的subject只用关心两件事:1.维护这个列表,2.发布事件
中介模式(Mediator Pattern)
让我们假设这样一个场景: 有一个Manager一声令下,需要让工人A和工人B开工,代码可以是这样的
其实还可以这么写,新增一个中介模块,这个模块有存储了Manager的常用命令比如start,stop,resume,每一个命令其实维护的也是一个列表,比如start的列表下存储了所有员工的start方法:
所以Manager的方法可以重写为
代码细节就不展示了,主要体现这么一个机制,而如果某个员工要提交自己的work方法供老板调用的话,只要注册一下就好了
问题是新增加一个中介模块的好处是什么?
1.低耦合!如果不是经理要让员工开始工作,是董事长怎么办,或者是部门主管怎么办,难道都要这么写
都要把A.work什么抄一遍?当然不是,只要给中介模块发出命令就好了,
2.模块之间不需要进行通信,只要负责广播和监听事件就好了
3.在模块化的javascript中,中介模块能提高可维护性:是否启动某个模块,有没有权限启动某个模块,异步加载某些模块,模块之间的依赖关系,某些模块启动失败了怎么办。这些边界条件都可以交给它来判断,而其他模块只关心实现自己逻辑就好了
最后打个比方,中介模块真的就像房屋中介一样!如果你是房东,你只需要下令一声“我要找人租房”,他们就自然会生成那个列表,你不用直接和房客打交道。
在GoF的原文中是这样描述观察者模式的:
One or more observers are interested in the state of a subject and register their interest with the subject by attaching themselves. When something changes in our subject that the observer may be interested in, a notify message is sent which calls the update method in each observer. When the observer is no longer interested in the subject's state, they can simply detach themselves.具体应用场景是,当subject的某个动作需要引发一系列不同对象的动作(比如你是一个班长要去通知班里的某些人),与其一个一个的手动调用触发的方法(私下里一个一个通知),不如维护一个列表(建一个群),这个列表存有你想要调用的对象方法(想要通知的人);之后每次做的触发的时候只要轮询这个列表就好了(群发),而不用关心这个列表里有谁,只用关心想让谁加入让谁退出
这个列表就叫做ObserverList,它有一些维护列表方法:
function ObserverList(){ this.observerList = [];}ObserverList.prototype.Add = function( obj ){};ObserverList.prototype.Empty = function(){};ObserverList.prototype.Count = function(){};ObserverList.prototype.Get = function( index ){};ObserverList.prototype.Insert = function( obj, index ){};ObserverList.prototype.IndexOf = function( obj, startIndex ){};ObserverList.prototype.RemoveAt = function( index ){};
而我们的subject只用关心两件事:1.维护这个列表,2.发布事件
function Subject(){ this.observers = new ObserverList();}Subject.prototype.AddObserver = function( observer ){ this.observers.Add( observer );}; Subject.prototype.RemoveObserver = function( observer ){ this.observers.RemoveAt( this.observers.IndexOf( observer, 0 ) );}; Subject.prototype.Notify = function( context ){ var observerCount = this.observers.Count(); for(var i=0; i < observerCount; i++){ this.observers.Get(i).Update( context ); // 在这里假设的是列表里的每个对象都有update方法,但个人觉得这个列表里也可以是不同对象的不同方法,只要能接受当前上下文作为参数, 可以这样执行: // subscription.callback.apply( subscription.context, args ); }};
中介模式(Mediator Pattern)
让我们假设这样一个场景: 有一个Manager一声令下,需要让工人A和工人B开工,代码可以是这样的
Manager.start = function () { A.work(); B.work();}
Mediator["start"] = [ { name: 'A', callback: 'work' }, { name: 'B', callback: 'workAgain' },]
所以Manager的方法可以重写为
Manager.start = function () { Mediator.publish('start') // publish 为触发命令函数,以此来触发start命令下维护的所有回调函数}
代码细节就不展示了,主要体现这么一个机制,而如果某个员工要提交自己的work方法供老板调用的话,只要注册一下就好了
Mediator.subscribe('C', function callback() {});
问题是新增加一个中介模块的好处是什么?
1.低耦合!如果不是经理要让员工开始工作,是董事长怎么办,或者是部门主管怎么办,难道都要这么写
XXX.start = function () { A.work() B.work();}
都要把A.work什么抄一遍?当然不是,只要给中介模块发出命令就好了,
2.模块之间不需要进行通信,只要负责广播和监听事件就好了
3.在模块化的javascript中,中介模块能提高可维护性:是否启动某个模块,有没有权限启动某个模块,异步加载某些模块,模块之间的依赖关系,某些模块启动失败了怎么办。这些边界条件都可以交给它来判断,而其他模块只关心实现自己逻辑就好了
最后打个比方,中介模块真的就像房屋中介一样!如果你是房东,你只需要下令一声“我要找人租房”,他们就自然会生成那个列表,你不用直接和房客打交道。
0 0
- 如何区分javascript设计模式中的中介者模式(Mediator Pattern)与观察者模式(Observer Pattern)?
- 设计模式------中介者模式(Mediator Pattern)
- 设计模式【中介者模式Mediator Pattern】
- 中介者模式(Mediator Pattern)
- 中介者模式(Mediator pattern)
- 中介者模式(Mediator pattern)
- 中介者模式 Mediator Pattern
- 中介者模式(Mediator Pattern)
- 中介者模式(Mediator Pattern)
- 中介者模式(Mediator Pattern)
- 中介者模式 [Mediator Pattern]
- 中介者模式【Mediator Pattern】
- 中介者模式 | Mediator Pattern
- Mediator Pattern-中介者模式
- Js-JavaScript 观察者设计模式 Observer Pattern
- 观察者设计模式(Observer Pattern)
- 设计模式 场景模拟 Mediator pattern 中介者模式
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- 2、搜索引擎的使用
- DSP6000的几个简单优化技巧
- 数字信号处理的学习资源
- 白话压缩感知(含Matlab代码)
- hdu 2122 Ice_cream’s world III(最小生成树))
- 如何区分javascript设计模式中的中介者模式(Mediator Pattern)与观察者模式(Observer Pattern)?
- 快速排序 算法摘记
- 如何重定向
- 如何让VM虚拟机全屏
- Oracle 中的JOIN
- 数据结构 第一章 学习感受与总结
- 深入理解嵌入式开发之系统开发篇全覆盖(MC9S12单片机、CAN技术介绍)
- JavaScript - Array对象的使用 及 数组排序 sort
- [LeetCode] Reorder List