js设计模式 - 装饰者模式

什么是装饰者模式

装饰者模式可以动态地给一个对象添加一些额外的职责。就增加功能来说,装饰者模式比通过继承生成子类更为灵活。

下面通过一个例子来详细的介绍一下。

我们销售一台电脑,每个电脑都是一个新的Computer对象,它都有一个price属性来表示价格,并且可以通过它的getPrice方法来得到它的价格:

var Computer = function(price){
  this.price = price || 100;
};

Computer.prototype.getPrice = function(){
  return this.price;
};

现在有个客户想要再加个内存条,如果通过继承的方式,我们要新增一个ComputerWithMemory对象。

var ComputerWithMemory = function(price){
  Computer.constructor.call(this, price);
};
ComputerWithMemory.prototype = new Computer();
ComputerWithMemory.prototype.getPrice = function(){
  return this.price + 20;
};

我们来验证一下:

var computer = new Computer();
var computer1 = new ComputerWithMemory();

computer.getPrice();  // 100
computer1.getPrice();  // 120

如果客户要加个固态硬盘,我们就有要再新增一个ComputerWithSSD对象,如果客户既要内存条,又要固态硬盘,那我们就要再新增一个ComputerWithMemoryAndSSD对象。

下面我们来用装饰者模式实现:

我们在Computer中加一个_decorateList属性来保存添加到对象上的装饰者列表:

var Computer = function(price){
  this.price = price || 100;

  this._decoratorList = [];
};

接下来,我们在Computer对象上预先定义好需要的装饰者:

Computer.decorators = {};
Computer.decorators.memory = {
  getPrice : function(price){
    return price + 20;
  }
};

Computer.decorators用来存储我们的装饰者。上面我们定义了一个加内存条的装饰者memory,注意它的getPrice方法是带参数price的。

到这里装饰者我们已经有了,但是装饰者是需要注册到具体对象上去的,我们就需要在加一个注册的方法:

Computer.prototype.decorate = function(decorate){
  this._decoratorList.push(decorate);
};

注册方法很简单,就是把要注册的装饰者加入到对象的装饰者列表中。参数decorate表示装饰者的名字,例如如果是上面的memory装饰者,参数decorate就是字符串“memory”。

最后我们再重写一下getPrice方法:

Computer.prototype.getPrice = function(){
  // 先得到我们的原价
  var price = this.price;
  // 遍历注册了的装饰者
  for(var i = 0, len = this._decoratorList.length; i < len; i++){
    var name = this._decoratorList[i];
    // 根据装饰者的名字得到装饰者
    // 再调用装饰者的getPrice方法来处理我们的价格price
    price = Computer.decorators[name].getPrice(price);
  }

  return price;
};

这样我们的装饰者模式就完成了,我们再来测试一下:

var computer = new Computer();
computer.getPrice();    // 100

// 加个内存条
computer.decorate(‘memory‘);
computer.getPrice();    // 120

现在如果我们要想加一个固态硬盘,我们只要在Computer对象上再加个ssd装饰者:

Computer.decorators.ssd = {
  getPrice : function(price){
    return price + 30;
  }
};

再来测试一下:

var computer = new Computer();

// 加个固态硬盘
computer.decorate(‘ssd‘);
computer.getPrice();    // 130

// 再加个内存条
computer.decorate(‘memory‘);
computer.getPrice();    // 150
时间: 2024-11-05 18:51:26

js设计模式 - 装饰者模式的相关文章

JS设计模式(门面模式)

<!--JS设计模式(门面模式)--> // 门面模式的概念:简化API接口 最经典的就是事件 // 做一件事情: 必须要调用2个函数分别是 a , b //案例:获得页面上多个元素并设置css样式 window.onload=function(){ setCss(["div1","div2","div3"],{ background:"blue", color:"#fff" }); } fun

JS 设计模式(工厂模式环境搭建)

<!--引入的核心JS文件--> <script type="text/javascript" src="CommonUtil.js"></script> <script type=text/javascript charset=utf-8> <!--JS设计模式(工厂模式)--> //搭建一个工厂环境 //卖车店 function CarShop(){}; CarShop.prototype={ cons

【笔记】设计模式——装饰者模式

实现一个类似QQavator功能的代码 1.原始实现 1 //存在的问题: 2 //1.wear*方法出现重复代码,可以重构:实质上为代码结构一致,输出内容相同,可以通过在定义一个基类,在基类中定义抽象的Wear*,在子类中重写: 3 //2.倘若需求中新增某种服饰,需要修改Person类代码,不符合开放--封闭原则: 4 //3.客户端中代码暴露了具体装饰细节,理想情况下只需要提供装饰顺序,装饰细节封装起来: 5 class Person 6 { 7 private string name;

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora

JS设计模式(桥接模式)

<!--引入的核心JS文件--> <script type="text/javascript" src="CommonUtil.js"></script> <script type=text/javascript charset=utf-8> <!--JS设计模式(桥接模式)--> //桥接模式:主要是把抽象和现实分离开来,使他们独立开来 //应用场景:事件监听回掉机制 window.onload=func

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用

设计模式---装饰者模式(学习笔记)

首先看装饰者模式的定义:动态的将责任附加到对象上.若要扩展功 能,装饰者提供了比继承更有弹性的替代方案! 先看看<大话设计模式>给出的类图: 实际上,装饰者模式就是:把装饰者对象当成"包装者",换言之,把要装饰的对象作为参数传递到装饰对象里去,然后进行操作.(如果理解不对,希望给指正),下面看代码来理解这个类图: 这是装饰者和需要装饰的具体对象共同的接口: public abstract class Component { abstract void Operation()

设计模式 - 装饰者模式(Decorator Pattern) 详解

装饰者模式(Decorator Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 使用方法: 1. 首先创建组件(Component)父类, 所有类,具体组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 可以进行扩展

Java设计模式——装饰者模式

JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构 图-装饰者模式结构图 Component : 定义一个对象接口,可以给这些对象动态地添加职责. interface Component {     public void operation(); } ConcreteComponent : 实现 Component 定义的接口. clas