根据热力学熵增定律,事物总是自发地向着更加混乱(无序)的方向发展,具体到项目中的代码,随着业务迭代,整个项目肯定会越来越繁杂与混乱,要使代码的熵增大得较为缓慢,需要人为干预管控-重构,这个时候需要懂一点设计模式。如果想要使一个功能具有额外的即插即用的附加功能,且不影响其原功能,那么,应该懂装饰器模式。
装饰器模式,顾名思义,就是给原有的内容起装饰作用,其核心的本质并未发生任何变更,换通俗点的话来说-就是被包装了一下,但这包装完之后,可以具有一个额外的能力,同时又不改变原有功能。打个比喻,乌龟🐢穿上龙袍,🐢还是🐢,并没有变成了龙,但是它可能有了龙太子的身份,是不?
现实中有一个很好说明装饰模式的例子:防滑轮胎
本质上,这个轮胎它还是一个轮胎,只是套上了防滑链条,轮胎就能在下雪的路面上形式,防止打滑;
function Wheel() {}
Wheel.prototype.walking = function() {
console.log('wheels walk on the road!');
}
轮胎能正常在普通路面行驶,但是到了下雪的路面,就会打滑,现在有两种办法,一个是使用雪地专门行驶的轮胎
function SnowWheel() {}
SnowWheel.prototype.walking = function() {
console.log('wheels walk on the snowy road!');
}
毕竟一辆普通的家用汽车,绝大多数场景都是行驶在正常的公路上,这样换上雪地轮胎,始终是有点麻烦了,这个时候防滑链条,就派上大大的用场了;
function SnowWheelDecorator(wheel) {
this.wheel = wheel; // 1
}
SnowWheelDecorator.prototype.walking = function() {
this.wheel.walking(); // 2
console.log('wheels walk on the snowy road!'); // 3
}
这里SnowWheelDecorator就是一个铁链,也就是轮胎的装饰器,套上它,就能在雪地上行驶了,也不会打滑。1轮子还是那个轮子,2轮子依旧能正常行驶在路面上,3但是轮子却增加了在雪地上行驶的功能;
var wheel = new Wheel();
wheel = new SnowWheelDecorator(wheel);
wheel.walking();
// wheels walk on the road!
// wheels walk on the snowy road!
当然也可以简化成如下这种方式:
var wheel = {
walk() {
console.log('wheels walk on the road!');
}
}
function snowWheelDecorator() {
console.log('wheels walk on the snowy road!');
}
var walking = wheel.walking;
wheel.walking = function() {
walking();
snowWheelDecorator();
}
最终:
var originFun1 = originFun; // 1
originFun = function() {
originFun1(); // 2
decorator(); // 3
}
这里就是一个简单的装饰模式的模型,就是在原功能的基础上扩展了新增的功能
1为原功能函数
2为使用原功能函数
3为增加新增功能
这样就实现了在不改变原结构的基础上,动态扩展功能的操作。