设计模式-装饰器模式

这篇具有很好参考价值的文章主要介绍了设计模式-装饰器模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简述

装饰者模式的定义为:动态的给一个对象添加其它功能。
从扩展性来说,这种方式比继承更有弹性,更加灵活,装饰者模式也体现了开闭原则(OCP)。

问题背景

星巴克咖啡订单项目(咖啡馆) :
1)咖啡种类/单品咖啡: Espresso(意大利浓咖啡)、ShortBlack、Decaf(无因咖啡)、LongBlack(美式咖啡)
2)配料: Milk、Soy(豆浆)、Chocolate
3)要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便
4)使用OO的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组合

解决方案1:传统方案

设计模式-装饰器模式
1)Drink是一个抽象类,表示饮品。
2)desc是对这个饮品的描述, 比如单品咖啡的名字,单品咖啡+配料
3)cost()方法是这个饮品的费用

最普通的设计就是有多少种组合那就写多少种类,这样排列组合下来类的数量会成倍增加,就会出啊先类爆炸。

解决方案2:解决类爆炸

设计模式-装饰器模式
1)通过往单品咖啡类中增加配料来减少类爆炸。
2)在增加或者删除配料种类时,代码的维护量很大,要维护每一个单品咖啡的类。
3)考虑使用装饰者模式

解决方案3:装饰者模式

装饰者模式原理

设计模式-装饰器模式
这个就是装饰者模式的UML类图,我们来解释一下:
1)Component是一个所有类的超类,都要继承它。
2)ConcreteComponent是被装饰者类
3)Decorator是所有装饰者的超类,装饰者类都要继承Decorator
4)装饰者和被装饰者有着共同的超类型,这一点很重要,因为装饰者必须能够取代被装饰者。这样,装饰者才能在被装饰者的基础上,加上自己的行为,以增强被装饰者的能力。
5)一个被装饰者可以被多个装饰者依次包装,这个包装行为是动态的,不限次数的。

装饰者模式解决星巴克咖啡订单问题

设计模式-装饰器模式

我们来解释一下:
1)Drink就是所有饮品的超类,就是前面所说的Component
2)Coffee是我们单品咖啡的父类
3)Decorator就是配料类的超类,配料就是装饰者。
4)如果我们点了单品咖啡,然后有加了配料,那么我们可以将这个单品咖啡类放到装饰类的Drink属性上,因为都继承了Drink,所以被装饰了的类也是Drink对象,所以如果我们再加配料,仍然可以将这个对象放到新的装饰者(配料)对象中的Drink属性上。

设计模式-装饰器模式

代码示例:

Drink类

public abstract class Drink {

    private String desc;
    private Double price = 0.00;

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public abstract Double cost();
}

配料超类(装饰者类)

public class Decorator extends Drink{

    private Drink obj;

    public Decorator(Drink obj) {
        this.obj = obj;
    }

    @Override
    public Double cost() {

        return super.getPrice() + obj.cost();
    }

    @Override
    public String getDesc() {
        return super.getDesc() + " " + super.getPrice() + " " + obj.getDesc();
    }
}

Coffee类

public class Coffee extends Drink{
    @Override
    public Double cost() {
        // 对于单体咖啡就是价格
        return super.getPrice();
    }
}

单体咖啡类

public class Espresso extends Coffee{
    public Espresso() {
        setDesc("Espresso");
        setPrice(3.00);
    }
}

public class LongBlack extends Coffee{
    public LongBlack() {
        setDesc("ShortBlack");
        setPrice(5.00);
    }
}

public class ShortBlack extends Coffee{
    public ShortBlack() {
        setDesc("ShortBlack");
        setPrice(4.00);
    }
}

配料类

public class Chocolate extends Decorator{
    public Chocolate(Drink obj) {
        super(obj);
        setDesc("Chocolate");
        setPrice(1.00);
    }
}

public class Milk extends Decorator{
    public Milk(Drink obj) {
        super(obj);
        setDesc("Milk");
        setPrice(1.10);
    }
}

public class Soy extends Decorator{
    public Soy(Drink obj) {
        super(obj);
        setDesc("Soy");
        setPrice(1.20);
    }
}

咖啡店类

public class CoffeeBar {
    public static void main(String[] args) {
        // 装饰者模式下订单:2份Chocolate + 1份Mikl的LongBlack

        // 1.点一份LongBlack
        Drink order = new LongBlack();
        System.out.println("单体咖啡" + order.getDesc() + "的费用:" + order.cost());

        // 2.加入一份Mikl
        order = new Milk(order);
        System.out.println("单体咖啡" + order.getDesc() + "的费用:" + order.cost());

        // 3.加入两份巧克力
        order = new Chocolate(order);
        order = new Chocolate(order);
        System.out.println("单体咖啡" + order.getDesc() + "的费用:" + order.cost());
    }
}

源码

GitHub地址:design-patterns文章来源地址https://www.toymoban.com/news/detail-461843.html

到了这里,关于设计模式-装饰器模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式--装饰者模式

    (1) 可乐种类/单品可乐 :BaiShiCola(百事可乐) FeiChangCola(非常可乐) CoCola(可口可乐) (2) 调料/附品: Milk  Chocolate (3) 要求在扩展新的可乐种类时 要具有良好的扩展性 改动方便 维护方便 (4) 使用OO的来就算不同之类可乐的费用 客户可以点单品可乐 也可以单品可乐+调料组合 方案1 

    2024年02月02日
    浏览(40)
  • 【设计模式】装饰器模式

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。 这种模式创建了一个装饰类,用来包装原有的

    2024年02月13日
    浏览(37)
  • 【设计模式】-装饰器模式

    在软件开发中,经常有需求对已有的对象进行功能的扩展,但是传统的继承方式会导致类的数量快速增多,且难以维护。为了解决这个问题,装饰器模式应运而生。 装饰器模式是一种结构型设计模式,它可以在运行时动态地将新的行为附加到对象上,而不改变其结构。这种方

    2024年02月14日
    浏览(36)
  • 设计模式——装饰器模式09

    装饰器模式:是在原有基础上进行装饰(无修改原来代码),来添加新的功能。 例如下面对普通耳机进行装饰。 设计模式,一定要敲代码理解 可加修饰器 抽象 通过委托方式聚合对象,并对其对象进行方法增强。使其 能在不改变对象接口的前提下强化对象功能。 代码下载

    2024年04月09日
    浏览(43)
  • 大话设计模式-装饰器模式

    大话设计模式书中,作者举了一个穿衣服的例子来为我们引入装饰器模式。 装饰模式在书中的定义是: 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。 这句话直接去理解可能会有点抽象,我结合书中的例子来讲讲自己的理解。假设有

    2024年04月24日
    浏览(34)
  • 设计模式7:装饰者模式

    官方说法:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。 个人理解:原始接口功能不足,需要添加新方法,但是别的地方已经实现了原始接口,所以原始接口又不能直接添加方法。这时候可以采用持有原始类对象,并且添加新方法

    2024年02月12日
    浏览(37)
  • 设计模式之装饰者模式

    咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡) 调料:Milk、Soy(豆浆)、Chocolate 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便 使用 OO 的来计算不同种类咖啡的费用: 客户可以点单品咖啡,也可以单品咖啡+调料组

    2024年02月09日
    浏览(40)
  • Java设计模式-装饰模式

    装饰模式在Java领域是一种常见的设计模式,它能够在不改变对象原有结构的情况下,动态地为对象添加新的功能。它通过封装原有对象,在运行时动态地为对象添加新的行为或者修改原有行为,以扩展对象的功能。这种方式避免了继承的静态特性,让对象的行为可以根据需要

    2024年02月04日
    浏览(45)
  • 【前端设计模式】之装饰模式

    装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变原有对象结构的情况下,动态地给对象添加额外的功能。装饰模式通过创建一个包装器(装饰器)来包裹原有对象,并在保持接口一致性的前提下,增加新的行为或修改原有行为。 继承或实现相同的接口 :装

    2024年02月09日
    浏览(37)
  • 【23种设计模式】装饰器模式

    个人主页 :金鳞踏雨 个人简介 :大家好,我是 金鳞 ,一个初出茅庐的Java小白 目前状况 :22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客 :这里是CSDN,是我学习技术,总结知识的地方。希望和各位大佬交流,共同进

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包