装饰模式(Decorator Pattern):

定义:在不改变原对象的情况下,动态的给对象添加一些额外的职责。就功能而言,装饰模式相比生成子类更为灵活。
目的:把类的核心职责和装饰功能区分开。可以去除相关类中重复的逻辑。
场景:当系统需要扩展一个类的功能,或者客户端需要动态的给一个对象添加功能,并且使用继承或生成子类会很复杂的时候。
装饰模式体现了"多用组合,少用继承"这一设计原则。

例:JS代码实现

// 一辆小汽车 的构造函数
function ACar () {
// 一辆原味小汽车的价格是 99 元
this.price = function () {
return 99
}
} // 装饰器 —— 汽车喇叭
function carTrumpet (car) {
let price = car.price()
car.trumpet = function () {
console.log('滴 滴滴')
}
// 一个喇叭加价 10 元
car.price = function () {
return price + 10
}
} // 装饰器 —— 行车记录仪
function carRecorder (car) {
let price = car.price()
car.recorder = function () {
console.log('让一让啊 让一让 我有行车记录仪')
}
// 一个行车记录仪加价 9.9 元
car.price = function () {
return price + 9.9
}
} // 初始化一辆小汽车
let car = new ACar()
// 给小汽车装上喇叭
carTrumpet(car)
// 给小汽车装上行车记录仪
carRecorder(car)
// 最后小汽车的价格是 118.9 元
console.log(car.price())

  

Git地址:https://github.com/skillnull/Design-Mode-Example

JavaScript设计模式 样例三 —— 装饰模式的更多相关文章

  1. JavaScript设计模式样例四 —— 单例模式

    单例模式(Singleton Pattern): 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 目的:阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例. 场景: ...

  2. JavaScript设计模式 样例二 —— 策略模式

    策略模式(Strategy Pattern): 定义:定义了一族算法: 封装了每个算法: 这族的算法可互换代替. 目的:将算法的使用与算法的实现分离开来. 场景:可用来消除大量的条件分支语句. 例:J ...

  3. JavaScript设计模式 样例一 —— 工厂模式

    工厂模式(Factory Pattern): 定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行. 目的:工厂模式是为了解耦,把对象的创建和使用 ...

  4. [b0011] windows 下 eclipse 开发 hdfs程序样例 (三)

    目的: 学习windows 开发hadoop程序的配置. [b0007] windows 下 eclipse 开发 hdfs程序样例 太麻烦 [b0010] windows 下 eclipse 开发 ...

  5. Javascript 设计模式 单例

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/30490955 一直很喜欢Js,,,今天写一个Js的单例模式实现以及用法. 1.单 ...

  6. javascript 设计模式1----单例模式

    定义:保证一个类仅有一个实例,并提供一个访问的全局接口: 就是收:当我们 var a = new a(); var a1 = new a()是:a与a1是相等的.怎么实现呢,就是第一次实例化.第二不在 ...

  7. 阅读《JavaScript设计模式》第三章心得

    简单工厂模式 1.通过类实例化对象创建 传统的用面向对象方法去创建很多类去实现某些功能不妥当,这样不仅占用的很多类名称,而且别人使用这些方法的同时要记住每个类的名字,所以这样不适合团队开发,所以我们可 ...

  8. [转] Lodop、C-Lodop使用说明及样例

    本文转自:http://www.lodop.net/LodopDemo.html Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码直接实现 复杂打印. ...

  9. WEB打印控件Lodop(V6.x)使用说明及样例

    WEB打印控件Lodop(V6.x)使用说明及样例 Lodop是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码生成复杂打印页. 控件功能强大,却简单易用,所有调用如同JavaScript扩展 ...

随机推荐

  1. HashMap原理及简单实现

    public class MyHashMap<K, V> { private class Entry<K, V> { int hash; K key; V value; Ent ...

  2. @清晰掉 sprintf sscanf双胞胎

    sprintf() 格式化输出函数(图形) 功能: 函数sprintf()用来作格式化的输出.用法: 此函数调用方式为int sprintf(char *string,char *format,arg ...

  3. 浏览器默认样式及reset

    写在前面 首先纠正一个易错概念.div并非生来就是块元素,而是每个浏览器都有一套默认的css样式(优先级最低),默认样式里会把div设置成display: block;还有margin,padding ...

  4. RotateZoom.cpp——Inter

    // RotateZoom.cpp : Defines the entry point for the console application. // #include "stdafx.h& ...

  5. 八、SpringBoot生产环境部署

    1.下载安装Tomcat 下载地址:https://tomcat.apache.org/download-90.cgi 如下图所示: 2.入口类继承SpringBootServletInitializ ...

  6. SPEL 表达式解析

    Spring Expression Language 解析器 SPEL解析过程 使用 ExpressionParser 基于 ParserContext 将字符串解析为 Expression, Exp ...

  7. gson转换json到bean时重命名

    @Expose   @SerializedName("0001") public Map<String,ChannelBean> c0001 = new HashMap ...

  8. await Vue.nextTick() 的含义分析

    概述 今天看别人的单元测试代码的时候碰到了一段代码 await Vue.nextTick(),初看起来不是很懂,后来通过查资料弄懂了,记录下来,供以后开发时参考,相信对其他人也有用. await Vu ...

  9. 工具类分享之获取Request/Response工具类《RequestContextHolderUtil》

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/aiyaya_/article/details/78975893前言在开发spring web项目时, ...

  10. pycharm2018.2安装

    1.官网下载安装包 https://www.jetbrains.com/pycharm/download/#section=windows (下载2018.2版本,进行破解) 2.参考其他博主安装破解 ...