JavaScript设计模式十六(设计原则)
单一职责原则
单一职责原则就是SRP,定义是一个对象只做一件事情,在代理模式、迭代器模式、单例模式和装饰者模式中我们其实都提到过单一职责原则,我们回一下代理模式中的SRP
var myImage = (function(){
var imgNode = document.createElement('img');
document.body.appendChild(imgNode);
return {
setSrc: function(src) {
imgNode.src = src;
}
}
})();
var proxyImage = (function(){
var img = new Image;
img.onload = funciton() {
myImage.setSrc(this.src);
}
return {
setSrc: function(src) {
myImage.setSrc('xxxx/loading.gif');
img.src = src;
}
}
})();
proxyImage.setSrc('xxxxx/abc.jpg');
这里myImage负责在页面中增加img标签,proxyImage负责预加载图片,并在预加载完成之后把请求交给本体myImage
SRP原则的优点降低了单个类或者对象的复杂度,按照职责把对象分解成更小的粒度,有利于代码的复用和单元测试
最少知识原则
最少知识原则LKP说的是一个软件实体应当尽可能的减少与其他实体发生相互作用,这里的软件实体是一个广义的,包括系统、类、模块、函数和变量。
也即是说我们在设计程序的时候,应该尽量减少对象之间的交互,如果两个对象之间不必彼此通信,那么这两个对象就不要发生直接的相互联系,这种情况一般是引入第三者对象,例如中介者模式
开放-封闭原则
开放-封闭原则OCP的定义是软件实体应该是可以扩展的,但是不可修改的。
它的思想就是当需要改变一个程序的功能或者给这个程序增加新功能的时候,可以使用增加代码的方式,但是不允许修改程序的源代码
例如我们的职责链模式
var order500yuan = new Chain(function( orderType, pay, stock ){
// 具体代码略
});
var order200yuan = new Chain(function( orderType, pay, stock ){
// 具体代码略
});
var orderNormal = new Chain(function( orderType, pay, stock ){
// 具体代码略
});
order500yuan.setNextSuccessor( order200yuan ).setNextSuccessor( orderNormal );
order500yuan.passRequest( 1, true, 10 ); // 500 元定金预购,得到 100 优惠券
可以看到,当我们增加一个新类型的订单函数时,不需要改动原有的订单函数代码,只需要 在链条中增加一个新的节点