09.Javascript设计模式之装饰器模式----Decorator

 

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,就说到这里了先,再续...

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值