一、装饰者模式的作用


为函数或者对象的方法添加一些行为。
 
 
二、装饰者模式的原理


装饰者模式不是直接修改对象,而是以要修改的对象为基础,新建一个对象。不过这个新建的对象看起来就像在原对象的基础上增添了一些行为而已。

1、在对象中使用装饰者模式:就是把对象作为参数传入另一个构造函数中,然后这个构造函数里面就利用这个对象,创造出一个新的附加了一些行为的对象。

2、在函数中使用装饰者模式:把函数传入另一个函数中,然后返回一个以参数函数为基础的函数。
 
 
三、装饰者模式的简单例子


需求一:

我们要创建一个游戏,里面的人物可以装备一些剑盾等道具。
实现一:
        function Person(personName) {
this.name = personName;
} Person.prototype.showEquipment = function() {
return '';//由于一开始人物是没有装备的。所以是空
}; //一个装饰者类,可以用来装备剑
function equipSword(person) {
this.person = person;
this.name = person.name;
}
equipSword.prototype.showEquipment = function() {
return this.person.showEquipment() + 'sword;';
}; //一个装饰者类,可以用来装备盾
function equipShield(person) {
this.person = person;
this.name = person.name;
}
equipShield.prototype.showEquipment = function() {
return this.person.showEquipment() + 'shield;';
};
        //使用
var person = new Person('guoqinglinag');
alert(person.showEquipment());//一开始什么都没有装备
person = new equipSword(person);
alert(person.showEquipment());//装备了sword之后,会显示sword
person = new equipShield(person);
alert(person.showEquipment());
 
需求二:
我们有一个函数,调用它会输出一串字符串。我们现在要求这个函数输出的都是大写。
实现二:
        //一个输出一串字符串的函数
function echoStr() {
return 'this is a string';
} //一个装饰者函数
function toUpperCase(func) {
return function() {
return func().toUpperCase();
}
} //使用
alert(echoStr());
echoStr = toUpperCase(echoStr);
alert(echoStr());
 
 
 
 
 
 
 
 
 

《javascript设计模式》笔记之第十二章:装饰者模式的更多相关文章

  1. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader) 代码工 ...

  3. JavaScript DOM编程艺术-学习笔记(第十二章)

    第十二章 1.本章是综合前面章节的所有东西的,一个综合实例 2.流程:①项目简介:a.获取原始资料(包括文本.图片.音视频等) b.站点结构(文件目录结构) c.页面(文件)结构 ②设计(切图) ③c ...

  4. 《深入理解java虚拟机》读书笔记十一——第十二章

    第十二章  Java内存模型与线程 1.硬件效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cac ...

  5. Linux内核设计与实现 总结笔记(第十二章)内存管理

    内核里的内存分配不像其他地方分配内存那么容易,内核的内存分配不能简单便捷的使用,分配机制也不能太复杂. 一.页 内核把页作为内存管理的基本单位,尽管处理器最小寻址坑是是字或者字节.但是内存管理单元MM ...

  6. JavaScript高级程序设计:第十二章

    DOM1级主要定义的是HTML和XML文档的底层结构.DOM2和DOM3级则在这个结构的基础上引入了更多的交互能力,也支持了更高级的XML特性.为此DOM2和DOM3级分为许多模块,这些模块如下: D ...

  7. apue学习笔记(第十二章 线程控制)

    本章将讲解控制线程行为方面的详细内容,而前面的章节中使用的都是它们的默认行为 线程属性 pthread接口允许我们通过设置每个对象关联的不同属性来细调线程和同步对象的行为.管理这些属性的函数都遵循相同 ...

  8. 流畅python学习笔记:第十二章:子类化内置类型

    子类化内置类型 在python2.2之后,内置类型都可以子类化,但是有一个注意事项:内置类型不会调用用户定义的类覆盖的特殊方法.这个说起来比较绕口,什么意思呢.我们来看下下面的代码: class Do ...

  9. Javascript设计模式笔记

    Javascript是越来越厉害了,一统前后端开发.于是最近把设计模式又看了一遍,顺便做了个笔记,以方便自己和他人共同学习. 笔记连载详见:http://www.meteorcn.net/wordpr ...

随机推荐

  1. ACM学习历程—HDU4956 Poor Hanamichi(模拟)

    Poor Hanamichi Problem Description Hanamichi is taking part in a programming contest, and he is assi ...

  2. CodeForces - 767A Snacktower

    题目大意 一个数可以被输出当且仅当所有比它大的数都已经输出.输入一个1~n的排列,求每次输出的输出序列. 题解 直接用堆模拟 #include <queue> #include <c ...

  3. 洛谷P1584 魔杖

    题目描述 Smart在春游时意外地得到了一种好东西——一种非常珍贵的树枝.这些树枝可以用来做优质的魔杖! 选择怎样的切割方式来制作魔杖非常重要,关键问题是——一把魔杖既不能太长.又不能太短,且制作出来 ...

  4. 闪回之 Flashback Data Archive

    背景:Oracle 11g 中 Flashback Data Archive 特性.将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和 undo 区别开来,这样就可以为 ...

  5. docker的操作

    查询容器 docker ps  只能查询到正在运行的docker镜像: 如果添加上-a的选项,则会显示所有的(包括已经exit,未启动)的容器 基于一个镜像来构建(run)容器,并启动 docker ...

  6. tcp/ip协议和http协议

    TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说 TCP/IP 被认为是一个四层协议:应用层(telnet, ftp, http, smtp, dns等),传输层(tcp, ...

  7. C#设计模式(5)——建造者模式

    一.概念 建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示. 二.模型 三.代码实现 /// <summary> /// 建造者模式的演变 /// 省略了指挥 ...

  8. CodeForces 1131G. Most Dangerous Shark

    题目简述:从左到右依次有$n \leq 10^7$个Domino骨牌,高度为$h_i$,手动推倒他的花费为$c_i$.每个骨牌之间的距离为$1$.一个骨牌可以被向左或者向右推倒.当第$i$个骨牌被推倒 ...

  9. TripAdvisor architecture 2011/06

    http://highscalability.com/blog/2011/6/27/tripadvisor-architecture-40m-visitors-200m-dynamic-page-vi ...

  10. skb_store_bits() 和 skb_copy_bits()

    int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len);    int skb_store_bits(c ...