美文网首页
设计模式之装饰者模式

设计模式之装饰者模式

作者: 回调的幸福时光 | 来源:发表于2019-06-17 17:52 被阅读0次

一、基础介绍

在不改变原对象的基础上,给对象动态增加职责(功能:属性或方法)的方式称为装饰者模式。

装饰者模式 UML 类图

二、装饰函数

2.1 通过保存原引用的方式

如果需要绑定 onload 事件,但又不确定是否别人已经绑定过,为了避免覆盖掉之前的 window.onload 函数中的行为,常见的做法是:

var _onload = window.onload || function() {};

window.onload = function() {
  _onload();
  // do otherthing
}

缺点:

  • 需要维护 _onload 这个中间变量
    如果函数的装饰链较长,或者需要装饰的函数变多,这些中间变量的数量会越来越多。
  • this 被劫持
    当调用一个全局函数时,this 是指向 window 的,但是保存的原引用所指向的函数内部可能对于 this 的指向有特定的要求。(例如:document.getElementId)
2.2 用 AOP 装饰函数
Function.prototype.before = function (beforefn) {
  var _self = this; // 保存原函数的引用
  return function () {
    beforefn.apply(this, arguments); // 执行新函数,且保证 this 不被劫持
    _self.apply(this, arguments);
  }
}

Function.prototype.after = function(afterfn) {
  var _self = this;
  return function () {
    var ret = _self.apply(this, arguments);
    afterfn.apply(this, arguments);
    return ret;
  }
}

如果不喜欢上面污染原型的方式,可采用下面的方式:

function before(fn, beforefn) {
  return function () {
    beforefn.apply(this, arguments);
    return fn.apply(this, arguments);
  }
}

function after(fn, afterfn) {
  return function () {
    var ret = fn.apply(this, arguments);
    afterfn.apply(this, arguments);
    return ret;
  }
}
2.3 ES7 Decorator

推荐阅读 阮一峰: 装饰器

三、装饰者模式和代理模式的区别

相同点:

  • 不改变原有接口
  • 这两种模式都描述了怎样为对象提供一定程度上的间接引用。

不同点:
代理模式的目的:当直接访问本体不方便或者不符合需要时,为本体提供一个替代者,控制对本体的访问。
代理模式强调 Proxy 与它的实体之间的关系。
代理模式通常只有一层代理-本体的引用。

装饰者模式的目的:为对象动态加入行为。
装饰者模式经常会形成一条长长的装饰链。

装饰者模式和适配器模式的区别

相同点: 不改变原有接口。

适配器的目的在于解决两个接口不兼容。

参考

《JavaScript 设计模式与开发实践》曾探
《JavaScript 设计模式》张容铭
Javascript设计模式系统讲解与应用

相关文章

  • JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计

    JavaScript 设计模式核⼼原理与应⽤实践 之 结构型设计模式 装饰器模式,又名装饰者模式。它的定义是“在不...

  • Java设计模式之 —— 装饰者(Decorator) — 点

    Java设计模式之 —— 装饰者(Decorator) — 点炒饭 下面会用做炒饭的例子来描述一下装饰者设计模式,...

  • 设计模式

    设计模式 单例模式、装饰者模式、

  • 设计模式笔记汇总

    目录 设计原则 “依赖倒置”原则 未完待续... 设计模式 设计模式——策略模式 设计模式——装饰者模式 设计模式...

  • java IO 的知识总结

    装饰者模式 因为java的IO是基于装饰者模式设计的,所以要了解掌握IO 必须要先清楚什么事装饰者模式(装饰者模式...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 设计模式之装饰者模式

    如果你没了解过装饰者模式,那么请继续往下看,如果你是老司机,那么,你可以快速往下看。 开始装个13,再进入正文。 ...

  • 设计模式之装饰者模式

    该模式可以避免滥用继承,在使用对象组合的方式,就能做到在运行时装饰类,此后便能在不修改任何底层代码的情况下给对象赋...

  • 设计模式之装饰者模式

    装饰者模式的定义是动态地给一个对象添加一些额外的职责。就增加功能来说,装饰者模式比生成子类更加灵活。 通常给一个对...

  • 设计模式之装饰者模式

    前言: 相信Java开发者在使用java i/o API的时候,对于以下代码写法应该非常熟悉: 在不知道具体设计实...

网友评论

      本文标题:设计模式之装饰者模式

      本文链接:https://www.haomeiwen.com/subject/zoaafctx.html