这是本人的设计模式学习笔记,把本身学习过程当中的一些总结和认识记录下来,与诸君共勉。设计模式
所谓装饰者,就是为以前的对象添加行为的存在,容许行为能够被修改而无需修改现有代码。要想了解装饰者,首先要介绍几个重要的概念:函数
咱们首先要了解如下特性:学习
咱们用下面这幅图来揭示装饰者的结构:this
下面给出一段代码的例子:spa
js//共有超类 var org=function(){this.cost=0;}; org.prototype.getCost=function(){}; //组件 var component=function(num){this.cost=num;}; component.prototype=new org(); component.prototype.getCost=function(){return this.cost;}; //装饰者 var decorator=function(component){ this.base=component; }; decorator.prototype=new org(); decorator.prototype.getCost=function(){ return this.base.getCost()+1.0; }; //装饰过程 var exp=new component(1.0); var exp2=new decorator(exp); exp2.getCost();//2.0
这里用js其实不大恰当,并不能很好地解释装饰者模式,之因此用js来讲明,是想说装饰者模式并不是仅仅限于oo语言的场合,对于动态语言,它依然大有用处。prototype
装饰者适用各类行为能够大量组合起来,这种时候不使用装饰者的话就不得不为全部的组合状况都定义一个类,这无疑是一个灾难。使用装饰者的话,就只用预先定义组合的元素,对于不一样的组合方式,动态地实现要求的接口,显然更加优越。设计
举一个例子,卖电脑器材,以每一次交易为一个对象,为了计算出交易金额和记录交易配件,若是使用继承的话,须要列出全部器材的组合状况,而使用装饰者模式的话,就是把每一种器件都作成一个装饰者。固然在这个例子里面好像这也不是什么好的解决方式,你能够用一个列表来记录所卖的全部器件,而后写个函数遍历列表计算。写出这个例子也是为了告诉咱们尽管不少地方可使用设计模式,但不要作设计模式驱动的开发,而是作设计原则驱动的开发。code