09.Javascript设计模式之装饰器模式----Decorator
首先,我非常遗憾的要说一声,我花了两个小时整理的关于装饰器模式的笔记,因为一个不可预期的故障,ADoc文档上传到服务器后,文件损坏了。 文件毫无备份。难道是我的笔记中包含法律禁止的文字?绝对不会。算了,我还是重新整理一份吧,对此深表郁闷。
引入正题,本文将以我这段时间对装饰者模式的学习、理解为基础,向大家介绍Javascript设计模式中的装饰器模式。我的理解程度非常有限,因此文档也不会描述的非常的周全,还请您做好心理准备。
装饰器模式的概念
装饰器模式动态地将职责附加到某对象上,让该对象具备了其原本不具备的一些特性。其有别于类继承,因为在功能扩展方面,装饰器模式提供了比类继承更有弹性的替代方案,而且完全不会影响到该对象在其他领域或模块中的应用。
有网友对装饰器给出了这样的总结,我觉得非常的好,所以摘录了下来:
装饰器涉及四个名词 1、接口或者抽象基类 2、被装饰对象,也就是一个简单的实现了1中提到的接口或者抽象基类的实现类 3、装饰对象,就是去装饰被装饰对象的对象 4、继承装饰对象类的子类,也就是具体的装饰器类了
装饰器模式示例
第一个名词
var IDecorator = new Interface("IDecorator",["sayHello"]);
第二个名词
var DecoratorImpl = function(){}; implements(DecoratorImpl,IDecorator); DecoratorImpl.prototype.sayHello = function(){ alert("Hello..."); };
第三个名词
真正的装饰器就在这里开始了,也是所有欲实现装饰器的父类
var Decorator = function(decorator){ //声明一个需要被装饰的对象,参数从构造器中获得 this.decorator = decorator; }; implements(Decorator,IDecorator); //在基类装饰器中只调用被装饰对象的方法 Decorator.prototype.sayHello = function(){ //注意这里的代码 this.decorator.sayHello(); };
再对这个装饰器的基类说明一下,在每个装饰器模式中,这个类的结构基本不变 或者说这上面是装饰器第三类名词中最小的类了,必须有以上定义的这些元素。
第四个名词
真正的装饰就看这里了,Please pay attention!
var SimpleDecorator = function(decorator){ //调用父类的构造器 this.superClass.prototype.constructor.call(this,decorator); }; //先进行类继承 inherits(SimpleDecorator,Decorator); //下面开始装饰 SimpleDecorator.prototype.sayHello = function(){ //在原来的方法中加入了sayChina方法 this.sayChina(); //调用父类的sayHello this.superClass.prototype.sayHello.call(this); //在原来的方法中加入sayWorld方法 this.sayWorld(); }; //定义这两个后来添加的方法 SimpleDecorator.prototype.sayChina = function(){ alert("China ,"); }; SimpleDecorator.prototype.sayWorld = function(){ alert("World!"); };
大胆的开始测试
var TestDecorator = function(){ //不使用装饰器 this.unUseDecorator = function(decorator){ decorator.sayHello(); //这里打印:Hello }; //使用装饰器 this.useDecorator = function(decorator){ var simpleDecorator = new SimpleDecorator(decorator); simpleDecorator.sayHello(); //这里打印China,Hello World! }; };
不要惊讶,装饰器就是这么强悍,把原来不变的方法改变了。
总结
那我们就来谈谈他的使用场景吧:
1、装饰器模式主要装饰供外部调用的接口方法,如果一个接口方法只是提供给内部调用,则不能使用该模式。 2、装饰器模式主要装饰可能要改变的接口方法,如果类中的某种行为在将来可能发生变化,而你又懒得去改变 原来的类,那么就可以考虑使用装饰器模式了。
OK,就说到这里了先,再续...