设计模式(八)结构型模式---装饰者模式

文章目录

  • 装饰者模式简介
  • 结构
  • UML图
  • 具体实现
    • UML图
    • 代码实现

装饰者模式简介

  • 装饰者模式(Decorator Pattern)是动态的将新对象依附到对象上。相当于对象可以包裹对象本身,然后可以根据递归方式获取想要的信息。
  • 实际使用: JDK中的IO流。

结构

  • 1.抽象构件角色(component):定义一个抽象接口以规范准备接受附加责任的对象。
  • 2.具体构件角色(concrete component):实现抽象构件,通过装饰角色为其添加一些职责。
  • 3.抽象装饰角色(decorator):继承或实现抽象构建,并包含具体构建的实例,可以通过其子类扩展具体构件的功能。
  • 3.具体装饰角色(concrete decorator):实现抽象装饰的相关方法,并给具体构建对象添加附加责任。

UML图

在这里插入图片描述

具体实现

例子:饭店点餐,一份炒饭10元,鸡蛋2元,培根2元,实现该点菜功能。

UML图

在这里插入图片描述

代码实现

  • 抽象构件类
package com.xxliao.pattern.structure.decorator.demo;

/**
 * @author xxliao
 * @description: 抽象构件类-快餐抽象类
 * @date 2024/5/25 12:41
 */
public abstract class FastFood {

    private float price;

    private String desc;

    public FastFood() {
    }

    public float getPrice() {
        return price;
    }

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

    public String getDesc() {
        return desc;
    }

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

    public FastFood(float price, String desc) {
        this.price = price;
        this.desc = desc;
    }

    /**
     * @description  获取价格方法
     * @author  xxliao
     * @date  2024/5/25 12:42
     */
    public abstract float cost();

}
  • 具体构件类
package com.xxliao.pattern.structure.decorator.demo;

/**
 * @author xxliao
 * @description: 具体构件类 - 炒面类
 * @date 2024/5/25 12:45
 */

public class FriedNoodles extends FastFood{

    public FriedNoodles() {
        super(12,"炒面");
    }

    @Override
    public float cost() {
        return getPrice();
    }
}
package com.xxliao.pattern.structure.decorator.demo;

/**
 * @author xxliao
 * @description: 具体构件类 - 炒饭
 * @date 2024/5/25 12:43
 */

public class FriedRice extends FastFood{

    public FriedRice(){
        super(10,"炒饭");
    }

    @Override
    public float cost() {
        return getPrice();
    }
}
  • 抽象装饰者角色
package com.xxliao.pattern.structure.decorator.demo;

/**
 * @author xxliao
 * @description: 抽象装饰类 - 配料类,继承FastFood,并聚合FastFood类
 * @date 2024/5/25 12:46
 */
public abstract class Garnish extends FastFood{

    private FastFood fastFood;

    public Garnish(FastFood fastFood) {
        this.fastFood = fastFood;
    }

    public Garnish(FastFood fastFood,float price, String desc) {
        super(price, desc);
        this.fastFood = fastFood;
    }

    public void setFastFood(FastFood fastFood) {
        this.fastFood = fastFood;
    }

    public FastFood getFastFood() {
        return fastFood;
    }
}
  • 具体装饰者角色
package com.xxliao.pattern.structure.decorator.demo;

/**
 * @author xxliao
 * @description: 具体装饰类 - 培根配料
 * @date 2024/5/25 12:51
 */
public class Bacon extends Garnish{

    public Bacon(FastFood fastFood) {
        super(fastFood,2,"bacon");
    }

    @Override
    public float cost() {
        return getPrice() + getFastFood().getPrice();
    }

    @Override
    public String getDesc() {
        return super.getDesc() + getFastFood().getDesc();
    }
}
package com.xxliao.pattern.structure.decorator.demo;

/**
 * @author xxliao
 * @description: 具体装饰类 - 鸡蛋类
 * @date 2024/5/25 12:49
 */
public class Egg extends Garnish{

    public Egg(FastFood fastFood) {
        super(fastFood,1,"egg");
    }

    @Override
    public float cost() {
        return getPrice() + getFastFood().getPrice();
    }

    @Override
    public String getDesc() {
        return super.getDesc() + getFastFood().getDesc();
    }
}
  • 测试客户端
package com.xxliao.pattern.structure.decorator.demo;

/**
 * @author xxliao
 * @description: 装饰者模式 测试客户端
 * @date 2024/5/25 12:54
 */
public class Client {
    public static void main(String[] args) {
        // 点一份炒饭
        FastFood friedRice = new FriedRice();

        System.out.println(friedRice.getDesc()+" "+friedRice.cost()+"元");

        // 添加一个鸡蛋
        FastFood eggFriedRice = new Egg(friedRice);
        //
        System.out.println(eggFriedRice.getDesc()+" "+eggFriedRice.cost()+"元");
    }
}
  • 测试结果
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/671243.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python根据版本下载外部库的.whl文件、python下载离线whl文件、python查找whl历史版本

文章目录 一、python下载外部库的.whl文件 当遇到pip源中没有对应的包,或者网络波动时,可能出现需要离线安装的方法。这里记录一下下载安装whl文件的操作。 一、python下载外部库的.whl文件 1、在浏览器输入https://pypi.org/进入PYPI官网 2、在弹出的…

LitCTF 2024(公开赛道)——WP

目录 Misc 涐贪恋和伱、甾―⑺d毎兮毎秒 你说得对,但__ 盯帧珍珠 Everywhere We Go 关键,太关键了! 女装照流量 原铁,启动! 舔到最后应有尽有 The love Web exx 一个....池子? SAS - Serializing Authent…

WSL2-Ubuntu22.04-配置

WSL2-Ubuntu22.04-配置 准备1. WSL相关命令[^1]2. WSL2-Ubuntu22.04可视化3. WSL2 设置 CUDA4. 设置OpenGL 本文介绍了WSL2的基本使用方法及可视化,着重介绍了GPU和OpenGL的设置。 准备 名称版本windows11wsl2CUDA12.5 1. WSL相关命令1 查看已安装的wsl distribut…

大话C语言:第21篇 数组

1 数组概述 数组是若干个相同类型的变量在内存中有序存储的集合。 数组是 C 语言中的一种数据结构,用于存储一组具有相同数据类型的数据。 数组在内存中会开辟一块连续的空间 数组中的每个元素可以通过一个索引(下标)来访问,索…

网上帮别人开网店卖货的骗局!

小红书帮别人开店卖货的骗局主要涉及到一些不法分子利用小红书平台的流量和用户信任度,通过虚假宣传、承诺高额利润等手段,诱骗用户开店并**所谓的“赚钱机会”。 这些骗局往往以“轻松创业、快速致富”为诱饵,吸引那些对创业充满热情但缺乏经…

汽美汽修店管理系统会员小程序的作用是什么

汽车后市场汽美汽修赛道同样存在着大量商家,连锁品牌店或个人小店等,门店扎堆且区域覆盖面积广,当然每天车来车往也有不少生意。 随着线上化程度加深和商家不断拓展市场的需要,传统运营模式可能难以满足现状,尤其是年…

多个短视频剪辑成一个视频:四川京之华锦信息技术公司

多个短视频剪辑成一个视频:创作中的艺术与技术 在数字时代,短视频以其短小精悍、内容丰富的特点,迅速成为社交媒体上的热门内容形式。然而,有时单一的短视频难以完全表达创作者的意图或满足观众的观赏需求。因此,将多…

【Qt秘籍】[009]-自定义槽函数/信号

自定义槽函数 在Qt中自定义槽函数是一个直接的过程,槽函数本质上是类的一个成员函数,它可以响应信号。所谓的自定义槽函数,实际上操作过程和定义普通的成员函数相似。以下是如何在Qt中定义一个自定义槽函数的步骤: 步骤 1: 定义槽…

springboot+vue+mybatis博物馆售票系统+PPT+论文+讲解+售后

如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统博物馆售票系统信息管理难度大,容错率低,…

高速模拟信号链的设计学习

目录 概述: 定义: 断开: 链路设计: 结论: 概述: 由于对共模参数及其与设备之间的关联缺乏了解,客户仍然会提出许多技术支持问题。ADC数据表指定了模拟输入的共模电压要求。关于这方面没有太…

物联网实战--平台篇之(十二)设备管理前端

目录 一、界面演示 二、设备列表 三、抖动单元格 四、设备模型 五、设备编辑 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.htm…

彩灯控制器设计 74ls160+ne555实现

一、选题背景 数字电子技术在我们生活中的应用非常之广泛,不论是在各个方面都会涉及到它,小到家用电器的自动控制,大到神舟九号和天空一号航天器的设计,都无可避免的要运用它。并且鉴于以理论推动实践及理论实践相结合为指导思想,特此用我们所学的理论知识来实践这次课程设…

Nginx编译安装,信号,升级nginx

编译安装nginx:前面博客有写编译安装过程 systemctl stop firewalld setenforce 0 mkdir /data cd /data wget http://nginx.org/download/nginx-1.18.0.tar.gz tar xf nginx-1.18.0.tar.gz cd nginx-1.18.0/ yum -y install make gcc pcre-devel openssl-devel …

数据结构与算法03-散列表(哈希表)

介绍 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在存储器存储位置的数据结构。也就是说,它通过计算出一个键值的函数,将所需查询的数据映射到表中一个位置来让人访问&…

项目质量管理

目录 1.概述 2.三个关键过程 2.1.规划质量管理(Plan Quality Management) 2.2.管理质量(Manage Quality) 2.3.控制质量(Control Quality) 3.应用场景 3.1.十个应用场景 3.2.产品设计与开发 4.小结…

【自动驾驶技术】自动驾驶汽车AI芯片汇总——地平线篇

0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。 本篇文章是这个系列的第二篇&#x…

微信小程序毕业设计-书橱系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

[C][栈帧]详细讲解

目录 1.栈帧1.进程地址空间2.栈帧说明 2.认识相关寄存器3.认识相关汇编命令4.过程理解5.栈帧总结6.补充 1.栈帧 1.进程地址空间 .进程地址空间 2.栈帧说明 调用函数,形成栈帧函数返回,释放栈帧局部变量是存放在栈区上的栈区内存的使用习惯是&#xff…

数据结构之实现“通讯录”

大家先赞后看,养成好习惯 你们的点赞和关注还有收藏就是我的动力!!! 目录 前言 一、通讯录文件的创建和联系人结构体定义 1.1 文件创建 1.2 联系人结构体定义 二、通讯录的功能实现 2.1通讯录初始化 2.2通讯录销毁 2.3添…

使用手机小程序给证件照换底色

临时遇到一个需求,需要给证件照换底色。原始图像如下 最终需要换成红底的。 本次使用一款小程序"泰世茂证件照",打开该小程序,如下图所示 单击开始制作,然后选择二寸红底,如下图所示 然后单击相…