中介者模式和原型模式
中介者模式,英文名:Mediator。
基本概念:中介者允许我们公开一个统一的接口,系统的不同部分可以通过该接口进行通信。
使用场景:一个系统的各个组件之间看起来有太多的直接关系,这时需要一个中心控制点,以便各个组件可以通过这个中心控制点进行通信。
作用:确保组件的交互是通过这个中心控制点来处理的,而不是通过显式的引用彼此。这种模式可以帮助我们解耦系统,并提高组件的可重用性。
具体场景:机场控制塔(中介者或中心控制点)处理飞机的起飞和降落,飞机之间的通信都是通过机场控制塔来传递的,而不是飞机与飞机之间传递的。
举个例子:
DOM事件冒泡机制下的事件委托的实现。
如果我们web应用程序中所有的事件绑定(订阅)针对的文档document而不是node节点,则这个文档document会有效的充当中介者。因为所有的事件触发,都是通过document传递给回调方法中的对象的。触发事件的元素(button,input等)都是通过document与回调方法中的对象进行通信的。
中介者模式最大的优势:它能够将系统中对象或组件之间所需的通信渠道从多对多减少到多对一。
中介者模式与观察者模式的区别:虽然中介者模式和观察者模式都能够促进代码解耦,但是中介者模式通过限制对象严格通过Mediator进行通信来实现代码解耦,观察者模式通过创建观察者对象,同时让观察者对象订阅目标对象来实现代码的解耦。
原型模式,英文名:Prototype
原型模式是基于原型继承的模式,我们可以创建一个对象,然后把这个对象作为其他对象的原型。
原型对象实际上是用作构造函数创建每个实例对象的蓝图(模板)。如果所用构造函数的原型包含一个name属性,那么由此构造函数创建的每个对象也会有同样的属性。
在ECMAScript5中,有一个方法Object.create(),此方法返回一个对象,并且接收两个参数,第一个参数是作为返回对象的原型对象,第二个参数是返回对象的额外属性对象(可选)。
举个例子:
var vehicle = { getModel:function(){ console.log(this.model); } }; var car = Object.create(vehicle, {"model":"chaojidan"}); car.getModel(); //打印出"chaojidan"
大家可能对Object.create方法的内部实现不太明白,其实很简单:
Object.create = function(pro,obj){ function f(){}; f.prototype = pro; var F = new f(); for(var i in obj){ //这个代码假设obj对象的属性值都是字符串 F.i = obj.i; } return F; }
原型模式还是很容易理解的,原型链必须掌握,不管是面试还是自己写代码,都非常有用。
加油!