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

2023-11-11

 

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

09.Javascript设计模式之装饰器模式----Decorator 的相关文章

随机推荐

  • 复变函数与积分变换系列(一) - 复变函数与解析函数

    复变函数与解析函数 Author Benjamin142857 TOC 0 几个基本概念 实虚部 P l u r a l
  • 关于代码评审

    代码评审实际是编写代码的开发人员在被复查 它是最小化缺陷的有效方法 无论公司实行代码评审的额外动机是什么 代码评审都是工业化的最优方法 一 代码评审目的 1 确保要发布质量可靠的代码 代码评审能非常有效地发现所有类型的错误 包括那些由于不正
  • Java基础三

    表达式自动提升类型 在程序中出现直接写出来的数字 如果是整数默认类型为int 如果为小数默认类型为double 一个表达式中包含多种数据类型时 结果的数据类型会自动提升 规则如下 byte short char 自动提升为int 整个表达式
  • selenium 二维码登陆解决方案

    selenium与api 的结合 获取到 qr id 然后api 带这个qr id 调用 然后就ok了 实现方式看代码 coding utf 8 auth cy create 11 27 18 update from time import
  • 告别if else!试试这款轻量级流程引擎吧,跟SpringBoot绝配!

    之前同事用了一款轻量级的规则引擎脚本AviatorScript 我也跟着用了起来 真的挺香 能少写很多代码 这期就给大家介绍一下这款规则引擎 简介 AviatorScript是一门高性能 轻量级寄宿于 JVM 包括 Android 平台 之
  • Mysql实现局域网访问

    Mysql实现局域网访问 文章目录 Mysql实现局域网访问 找到MYSQL数据库中的User表 找到自己账号的那条数据 将Localhost 改为 号 代表所有ip都可以访问 Localhost代表只有自己可以访问 这样就实现了局域网访问
  • 详解Mysql主键

    主键 对于关系表 有个很重要的约束 就是任意两条记录不能重复 不能重复不是指两条记录不完全相同 而是指能够通过某个字段唯一区分出不同的记录 这个字段被称为主键 对主键的要求 最关键的一点是 记录一旦插入到表中 主键最好不要再修改 因为主键是
  • Schedulis 普通版环境部署

    Schedulis 普通版环境部署 一 使用前置 请基于 Linux 操作系统操作 建议 CentOS 创建新用户 hadoop 并为该用户赋予 root 权限 用于部署schedulis 准备好 MySQL 版本5 5 的客户端和服务端
  • String s = new String("abc");产生了几个对象?

    对于这个问题 老套路先上代码 public class StringTest public static void main String args String s1 Hello String s2 Hello String s3 new
  • ZooKeeper在Spark的使用

    摘抄一段 ZooKeeper 官网的一句话 大意就是 ZooKeeper 为分布式应用提供了高效可靠的分布式协调服务 提供了统一命名服务 配置管理和分布式锁等分布式的基础服务 ZooKeeper is a centralized servi
  • 数据结构实验6:二叉树的遍历,深度计算,度为1的个数

    题目 1 实现二叉树前序 中序 后序遍历的递归算法 2 计算二叉树的深度 递归和非递归算法 3 统计二叉树度为1的节点个数 递归和非递归算法
  • JS使用及mysql 查询语句

    目录 1 javascript的使用方式1 2 js的使用方式2 3 js中定义变量以及数据类型划分 4 Js之运算符 5 js之流程控制语句 6 js事件编程的三要素 7 javascript中如何定义函数以及调用函数 8 js中Date
  • 请问VARCHAR2(128)能存多少个汉字?

    Q 请问VARCHAR2 128 能存多少个汉字 A 看看什么字符集 或者看单个汉字几个字节lengthb Q 请问怎样查看你所提出的两个问题 A oracle中length 与lengthb 区别 SQL gt select length
  • 多个数计算最大公约数与最小公倍数的模板

    这是道计算两个数的最大公约数与最小公倍数的题目 辗转相除法实现计算最大公约数 多个数的最大公约数 计算多个数的最大公约数的算法思路 计算前两个数是最大公约数 记为gcd 再计算gcd与第三个数的最大公约数 更新gcd为本次计算的最大公约数
  • 如何检查 Docker 镜像是否存在漏洞

    Docker 可以将应用程序及其依赖项打包到一个虚拟容器中 该容器可以在任何 Linux Windows 或 macOS 计算机上运行 这使应用程序可以在各种位置运行 例如本地 公共 请参阅分散计算 分布式计算和云计算 或私有云 在 Lin
  • 正规式和正则表达式的异同

    正规式的定义及使用方法 转自正规式 设 是有穷字母表 并定义辅助字母表 都是 上的正规式 它们所表示的正规集为 任何a是一个正规式 若a 它所表示的正规集为 a 如果R1和R2是正规式 它们表示的正规集分别为L1和L2 则 R1 R2 R1
  • 滤波电容容值与所滤噪声频率的关系

    去耦电容的选择不存在与频率的精确对应关系 理论上越大越好 但现实中所有器件都不是理想器件 不论何种电容 ESL ESR都是必然存在的 于是实际电容的频响曲线明显呈非线性 仅在一定频率区间内基本符合纯电容的理论计算结果 超出一定界限后就与理论
  • Chaincode之间调用

    API InvokeChaincode 可以一个chaincode中调用另外一个chaincode中的函数 两个chaincode需要安装在相同的peer结点中 如果只需要查询被调链码的世界状态 可以在不同通道中进行 如果涉及更新操作 两个
  • QT中为生成的exe运行文件添加图标

    1 准备好ico图标文件名字为test ico 最好放在和 pro文件同一个文件夹中 2 创建一个叫icon rc的文件 里面写上文本信息IDI ICON1 ICON test ico 保存好 3 在pro文件中添加代码 RC FILE i
  • 09.Javascript设计模式之装饰器模式----Decorator

    09 Javascript设计模式之装饰器模式 Decorator 首先 我非常遗憾的要说一声 我花了两个小时整理的关于装饰器模式的笔记 因为一个不可预期的故障 ADoc文档上传到服务器后 文件损坏了 文件毫无备份 难道是我的笔记中包含法律