资讯专栏INFORMATION COLUMN

JS 设计模式 十二(装饰着模式)

zhigoo / 3070人阅读

摘要:装饰器模式对客户透明的方式动态地给一个对象附加上更多的责任,同时又不改变其结构。装饰器要素抽象构件角色给出一个抽象接口,以规范准备接收附加责任的对象。就增加功能来说,装饰器模式相比生成子类更为灵活。

装饰器模式

对客户透明的方式动态地给一个对象附加上更多的责任,同时又不改变其结构。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。

装饰器要素

1.抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
2.具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
3.装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
4.具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

例子

咖啡,可加牛奶,也可加糖,或者都加。

//装饰着模式    
var DP = require("./DesignPattern.js");

function Icoffee() {
  DP.Interface(this, ["showCoffee", "getPrice"]);
}

function Coffee(name, price) {
  this.__proto__ = new Icoffee();
  var _name, _price;
  _name = name;
  _price = price;
  this.showCoffee = function () {
    console.log(_name + "coffee");
  }
  this.getPrice = function () {
    return _price;
  }
}

function Decorator(Coffee) {
  var _coffee;
  _coffee = Coffee;
  this.showCoffee = function () {
    _coffee.showCoffee();
  }
  this.getPrice = function () {
    return _coffee.getPrice();
  }
}

function Sugar(Coffee) {
  this.__proto__ = new Decorator(Coffee);
  this.showCoffee = function () {
    console.log("加糖");
    this.__proto__.showCoffee();
  }
  this.getPrice = function () {
    return this.__proto__.getPrice() + 5;
  }
}

function Milk(Coffee) {
  this.__proto__ = new Decorator(Coffee);
  this.showCoffee = function () {
    console.log("加牛奶");
    this.__proto__.showCoffee();
  }
  this.getPrice = function () {
    this.__proto__.getPrice();
    return this.__proto__.getPrice() + 5;
  }
}

var coffee = new Coffee("拿铁", 20);

var sugar = new Sugar(coffee);
sugar.showCoffee();
console.log(sugar.getPrice());
console.log("--------------------------------------------");
var milk = new Milk(coffee);
milk.showCoffee();
console.log(milk.getPrice());
console.log("--------------------------------------------");
var sugarmilk = new Milk(sugar);
sugarmilk.showCoffee();
console.log(sugarmilk.getPrice());
console.log("--------------------------------------------");
var sugarmilkmilk = new Milk(sugarmilk);
sugarmilkmilk.showCoffee();
console.log(sugarmilkmilk.getPrice());
装饰器模式优点:

1.装饰类和被装饰类可以独立发展,不会相互耦合。
2.装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。就增加功能来说,装饰器模式相比生成子类更为灵活。

适用场景:

1.扩展一个类的功能。
2.动态增加功能,动态撤销。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79550.html

相关文章

  • dubbo源码解析(二十二)远程调用——Protocol

    摘要:七该类也实现了,也是装饰了接口,但是它是在服务引用和暴露过程中加上了监听器的功能。如果是注册中心,则暴露该创建一个暴露者监听器包装类对象该方法是在服务暴露上做了监听器功能的增强,也就是加上了监听器。 远程调用——Protocol 目标:介绍远程调用中协议的设计和实现,介绍dubbo-rpc-api中的各种protocol包的源码,是重点内容。 前言 在远程调用中协议是非常重要的一层,看...

    孙淑建 评论0 收藏0
  • 你不可错过的前端面试题(二)

    摘要:有效防止黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。可以通过指定候选样式。存储大小数据大小不能超过。初始化样式会对有一定的影响,但鱼和熊掌不可兼得,力求影响最小的情况下初始化样式。二十和联系他们都能让元素不可见。 一、前端需要注意的SEO (1)合理的 title、description 和 keywords,他们的搜索权重逐个减小title 强调重点即可,重要关...

    JohnLui 评论0 收藏0
  • 你不可错过的前端面试题(二)

    摘要:有效防止黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。可以通过指定候选样式。存储大小数据大小不能超过。初始化样式会对有一定的影响,但鱼和熊掌不可兼得,力求影响最小的情况下初始化样式。二十和联系他们都能让元素不可见。 一、前端需要注意的SEO (1)合理的 title、description 和 keywords,他们的搜索权重逐个减小title 强调重点即可,重要关...

    muddyway 评论0 收藏0
  • 你不可错过的前端面试题(二)

    摘要:有效防止黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。可以通过指定候选样式。存储大小数据大小不能超过。初始化样式会对有一定的影响,但鱼和熊掌不可兼得,力求影响最小的情况下初始化样式。二十和联系他们都能让元素不可见。 一、前端需要注意的SEO (1)合理的 title、description 和 keywords,他们的搜索权重逐个减小title 强调重点即可,重要关...

    pkhope 评论0 收藏0
  • 设计模式装饰模式

    摘要:相关设计模式装饰者模式和代理模式装饰者模式关注再一个对象上动态添加方法代理模式关注再对代理对象的控制访问,可以对客户隐藏被代理类的信息装饰着模式和适配器模式都叫包装模式关于新职责适配器也可以在转换时增加新的职责,但主要目的不在此。 0x01.定义与类型 定义:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的...

    chuyao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<