设计模式--装饰者模式

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

问题

  星巴克可乐订单

(1) 可乐种类/单品可乐 :BaiShiCola(百事可乐) FeiChangCola(非常可乐) CoCola(可口可乐)

(2) 调料/附品: Milk  Chocolate

(3) 要求在扩展新的可乐种类时 要具有良好的扩展性 改动方便 维护方便

(4) 使用OO的来就算不同之类可乐的费用 客户可以点单品可乐 也可以单品可乐+调料组合

方案1 

(1) drink是一个抽象类 表示饮料

(2) des是对可乐的描述 比如可乐的名字

(3) cost()方法就是计算费用 drink类中为一个抽象方法

(4) Cola就是单品可乐 继承drink 并实现cost()

(5) CoCola&&Milk就是单品可乐+调料 这个组合很多

(6) 问题:这样设计 会有很多类 当我们增加一个单品可乐 或者一个新的调料 类的数量就会倍增 会出现类爆炸

方案2

前面分析的方案1因为可乐单品+调料组合会造成类的倍增 因此可以做改进 将调料内置到Drink类 这样就不会造成类数量过多 从而提高项目的可维护性

说明: milk cholocate可以设计为Boolean 表示是否要添加相应的调料

(1) 方案2 可以控制类的数量 不至于造成很多的类

(2) 在增加或者删除调料种类时 代码的维护量很大

(3) 考虑到用具可以添加多份调料时 可以将 hasMilk返回对应的int

(4) 使用 装饰者模式

基本介绍

装饰者模式 :动态的将新功能附加到对象上 在对象功能扩展方面 它比继承更有弹性 装饰者模式体现了开闭原则(OCP)

关键点: 组合+继承

代码举例

书写抽象Drink

@Data
public abstract class Drink {
    private String des; //描述
    private float price = 0.0f;

    /**
     * 计算费用的抽象方法
     * 具体细节子类来实现
     * @return
     */
    abstract float cost();
}

单品可乐

public class Cola extends Drink {
    @Override
    float cost() {
        return getPrice();//调用父类抽象方法
    }
}

具体可乐实现 百事可乐

public class BaiShiCola extends Cola{
    public BaiShiCola(){
        setPrice(4.0f);
        setDes("百事==>"+getPrice()); //父类方法
    }
}

具体可乐实现 可口可乐

public class CoCola extends Cola{
    public CoCola(){
        setPrice(3.0f);
        setDes("可口可乐==>"+getPrice()); //父类方法

    }
}

具体可乐实现 非常可乐

public class FeiChangCola extends Cola {
    public FeiChangCola() {
        setPrice(2.0f);
        setDes("非常可乐==>"+getPrice()); //父类方法
    }
}

装饰器

public class Decorator extends Drink{
    private Drink drink;

    Decorator(Drink drink){//组合
        this.drink = drink;
    }


    @Override
    float cost() {
        //getPrice 本身价格
        return getPrice()+drink.cost();
    }

    @Override
    public String getDes() {
        //drink.getDes() 输出被装饰者信息
        return super.getDes()+"==>"+getPrice()+"&&"+drink.getDes();
    }

    @Override
    public float getPrice() {
        return super.getPrice();
    }
}

具体的装饰 巧克力

//具体的装饰 巧克力
public class Chocolate extends Decorator {
    Chocolate(Drink drink){
        super(drink);
        setDes("巧克力");
        setPrice(3.0f);//调味品的价格
    }
}

具体的装饰 牛奶

public class Milk extends Decorator {
    Milk(Drink drink){
        super(drink);
        setDes("牛奶");
        setPrice(5.0f);//调味品的价格
    }
}

测试

设计模式--装饰者模式文章来源地址https://www.toymoban.com/news/detail-432546.html

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

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

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

相关文章

  • 设计模式-装饰器模式

    装饰者模式的定义为:动态的给一个对象添加其它功能。 从扩展性来说,这种方式比继承更有弹性,更加灵活,装饰者模式也体现了开闭原则(OCP)。 星巴克咖啡订单项目(咖啡馆) : 1)咖啡种类/单品咖啡: Espresso(意大利浓咖啡)、ShortBlack、Decaf(无因咖啡)、LongBlack(美式咖啡) 2)

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

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

    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)
  • 【23种设计模式】装饰模式(九)

    装饰模式 ,英文名称: Decorator Pattern 。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理解吧,大家一定要看清楚,是“装修”,不是“装饰”。在房子装修的过程中,各种功能可以相互组合,来增加房子的功用。类似的,如果我们在软件系

    2024年02月09日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包