懂一点设计模式-装饰器模式

518 阅读2分钟

根据热力学熵增定律,事物总是自发地向着更加混乱(无序)的方向发展,具体到项目中的代码,随着业务迭代,整个项目肯定会越来越繁杂与混乱,要使代码的熵增大得较为缓慢,需要人为干预管控-重构,这个时候需要懂一点设计模式。如果想要使一个功能具有额外的即插即用的附加功能,且不影响其原功能,那么,应该懂装饰器模式。

装饰器模式,顾名思义,就是给原有的内容起装饰作用,其核心的本质并未发生任何变更,换通俗点的话来说-就是被包装了一下,但这包装完之后,可以具有一个额外的能力,同时又不改变原有功能。打个比喻,乌龟🐢穿上龙袍,🐢还是🐢,并没有变成了龙,但是它可能有了龙太子的身份,是不?

现实中有一个很好说明装饰模式的例子:防滑轮胎

R-C.jpg 本质上,这个轮胎它还是一个轮胎,只是套上了防滑链条,轮胎就能在下雪的路面上形式,防止打滑;

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为增加新增功能

这样就实现了在不改变原结构的基础上,动态扩展功能的操作。