我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java中的装饰者模式是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java中的装饰者模式是什么

本篇内容介绍了“java中的装饰者模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • 引例

  • 一般解法

  • 装饰者模式

  • 装饰者解法

    • 代码:

      • 抽象类

      • 装饰者

      • 被装饰者

      • 客户端测试

  • 总结:

    引例

    需求:设现在有单品咖啡:Espresso(意大利浓咖啡)和LongBlack(美式咖啡),调料有Milk(牛奶)和sugar(糖),客户可以点单品咖啡或单品咖啡+调料的组合,计算相应费用。要求在扩展新的咖啡种类时,具有良好的扩展性、改动维护方便。

    抛砖引玉,我们先看看两种一般解法。

    一般解法

    方案一、

    枚举创建每一种组合可能,Drink抽象类表示饮料,cost()方法计算价格,子类如Longblack_Milk表示美式咖啡加牛奶:

    java中的装饰者模式是什么

    这样设计十分不明智,会有很多类,当新增一个单品咖啡或调料时,类的数量就会倍增,出现类爆炸。

    方案二、

    把调料内置到Drink类,减少类数量过多:

    java中的装饰者模式是什么

    方案二虽然不至于造成很多类,但是增加或删除调料时,代码维护量仍旧很大。

    装饰者模式

    装饰者模式(Decorator Pattern)是结构型模式,也称装饰器模式/修饰模式。它可以动态的将新功能附加到对象上,同时又不改变其结构。在对象功能扩展方面,它比继承更有弹性。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

    类图:

    java中的装饰者模式是什么

    1. Component抽象类:主体,比如类似前面的Drink。

    2. ConcreteComponent类:具体的主体,比如前面的单品咖啡。

    3. Decorator类:装饰者,比如前面的调料

    4. ConcreteDecorator类:具体的装饰者,比如前面的牛奶。

    如果ConcreteComponent具体子类很多,那么可以再加一个中间层,提取共同部分,通过继承实现更多不同的具体子类。

    装饰者解法

    类图:

    java中的装饰者模式是什么

    Drink 类就是前面说的抽象类Decorator 是一个装饰类,含有一个被装饰的对象(Drink obj)和的cost()方法进行一个费用的叠加计算,递归的计算价格Milk和Suger是具体的装饰者Coffee是被装饰者主体LongBlack和Espresso是具体实现的被装饰者实体

    代码:

    抽象类
    public abstract class Drink {//抽象类    public String des; // 描述    private float price = 0.0f;    public String getDes() {        return des;    }    public void setDes(String des) {        this.des = des;    }    public float getPrice() {        return price;    }    public void setPrice(float price) {        this.price = price;    }    //计算费用的抽象方法    public abstract float cost();}
    装饰者
    public class Decorator extends Drink {//装饰者    private Drink obj;    public Decorator(Drink obj) { //组合        this.obj = obj;    }    @Override    public float cost() {        // getPrice 自己价格        return super.getPrice() + obj.cost();    }    @Override    public String getDes() {        // obj.getDes() 输出被装饰者的信息        return des + " " + getPrice() + " && " + obj.getDes();    }}public class Milk extends Decorator {//装饰者子类    public Milk(Drink obj) {        super(obj);        setDes(" 牛奶 ");        setPrice(2.0f);    }}public class Suger extends Decorator {//装饰者子类    public Suger(Drink obj) {        super(obj);        setDes(" 糖 ");        setPrice(1.0f);    }}
    被装饰者
    public class Coffee  extends Drink {//被装饰者    @Override    public float cost() {        return super.getPrice();    }}public class Espresso extends Coffee {//被装饰者子类    public Espresso() {        setDes(" 意式咖啡 ");        setPrice(6.0f);    }}public class LongBlack extends Coffee {//被装饰者子类    public LongBlack() {        setDes(" 美式咖啡 ");        setPrice(5.0f);    }}
    客户端测试
    public class Client {    public static void main(String[] args) {        // 阿姨的卡布奇诺:意式加两份牛奶、一份糖        // 1. 点一份Espresso        Drink order = new Espresso();        System.out.println("order1 费用=" + order.cost());        System.out.println("order1 描述=" + order.getDes());        // 2.1 order 加一份牛奶        order = new Milk(order);        System.out.println("order 加入一份牛奶 费用 =" + order.cost());        System.out.println("order 加入一份牛奶 描述 = " + order.getDes());        // 2.2 order 再加一份牛奶        order = new Milk(order);        System.out.println("order 加入两份牛奶 费用 =" + order.cost());        System.out.println("order 加入两份牛奶 描述 = " + order.getDes());        // 3. order 加一份糖        order = new Suger(order);        System.out.println("order 两份牛奶、一份糖 费用 =" + order.cost());        System.out.println("order 两份牛奶、一份糖 描述 = " + order.getDes());        System.out.println("===========================");        //美式咖啡加一份牛奶        //1. 点一份LongBlack        Drink order2 = new LongBlack();        System.out.println("order2 费用 =" + order2.cost());        System.out.println("order2 描述 = " + order2.getDes());        //2. order2 加一份牛奶        order2 = new Milk(order2);        System.out.println("order2 加入一份牛奶 费用 =" + order2.cost());        System.out.println("order2 加入一份牛奶 描述 = " + order2.getDes());    }}

    运行结果:

    java中的装饰者模式是什么

    总结:

    装饰者模式就像打包一个快递,不断的动态添加新的功能,可以组合出所有情况:

    java中的装饰者模式是什么

    第一份Milk包含一份Espresso

    第二份Milk包含(Milk+Espresso)

    Suger包含(Milk+Milk+Espresso)

    “java中的装饰者模式是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    java中的装饰者模式是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    java中的装饰者模式是什么

    本篇内容介绍了“java中的装饰者模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录引例一般解法装饰者模式装饰者解法代码:抽象类装
    2023-06-20

    java中装饰者模式的原理是什么

    java中装饰者模式的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序
    2023-06-14

    JavaScript中什么是装饰者模式

    本篇文章为大家展示了JavaScript中什么是装饰者模式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JavaScript有什么特点1、js属于一种解释性脚本语言;2、在绝大多数浏览器的支持下,j
    2023-06-14

    java中什么是装饰模式

    这篇文章将为大家详细讲解有关java中什么是装饰模式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系
    2023-06-14

    Java装饰者模式怎么理解

    本篇内容主要讲解“Java装饰者模式怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java装饰者模式怎么理解”吧!一、装饰模式的定义和特点在软件开发过程中,有时想用一些现存的组件。这些组
    2023-06-22

    java中代理和装饰者模式有什么区别

    java中代理和装饰者模式有什么区别?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2
    2023-06-14

    java中的代理模式与装饰者模式的区别

    代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用。装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。(免费
    java中的代理模式与装饰者模式的区别
    2016-06-09

    Java装饰者模式的示例分析

    小编给大家分享一下Java装饰者模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!定义装饰者模式:在不改变原有对象的基础之上,动态的将功能附加到对象上,
    2023-06-29

    如何在java中使用装饰者模式

    如何在java中使用装饰者模式?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开
    2023-06-14

    java如何实现装饰者模式

    这篇文章主要介绍java如何实现装饰者模式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!定义: 在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能。 它是通过创建一个包装对象,也就是用装
    2023-05-30

    在Java项目中实现装饰者模式的方法

    在Java项目中实现装饰者模式的方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。装饰模式在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对
    2023-05-31

    java中的建造者模式是什么

    本篇内容主要讲解“java中的建造者模式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中的建造者模式是什么”吧!目录引例一般解法代码:AbstractHouse(房子)Bungal
    2023-06-20

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录