当前位置: 首页 > news >正文

Java设计模式之装饰器模式

装饰器模式是一种结构型设计模式,它允许动态地将责任附加到对象上。装饰器模式是通过创建一个包装对象,也就是装饰器,来包裹真实对象,从而实现对真实对象的功能增强。装饰器模式可以在不修改原有对象的情况下,动态地添加功能。

装饰器模式通常由以下几个组件组成:

1.Component(组件接口):定义了一个对象接口,可以给这些对象动态地添加职责。

2.ConcreteComponent(具体组件):实现了组件接口,是被装饰的对象。

3.Decorator(装饰器抽象类):持有一个指向组件对象的引用,并实现了组件接口。通常是一个抽象类,用于定义装饰器的基本行为。

4.ConcreteDecorator(具体装饰器):扩展了装饰器抽象类,实现了具体的装饰功能。

开始上代码
首先我们定义一个咖啡

// 组件接口
interface Coffee {double cost();String getDescription();
}

咖啡分很多种类,我们先来一个浓缩咖啡

// 具体组件 - 浓缩咖啡
class Espresso implements Coffee {@Overridepublic double cost() {return 1.5;}@Overridepublic String getDescription() {return "Espresso";}
}

然后我觉得浓缩咖啡有点苦,所以我想加点糖和牛奶
所以这里我们要开始上装饰器了

// 装饰器抽象类
abstract class CoffeeDecorator implements Coffee {protected Coffee coffee;public CoffeeDecorator(Coffee coffee) {this.coffee = coffee;}@Overridepublic double cost() {return coffee.cost();}@Overridepublic String getDescription() {return coffee.getDescription();}
}

加奶的装饰器

// 具体装饰器 - 加牛奶
class Milk extends CoffeeDecorator {public Milk(Coffee coffee) {super(coffee);}@Overridepublic double cost() {return super.cost() + 0.5;}@Overridepublic String getDescription() {return super.getDescription() + ", Milk";}
}

加糖的装饰器

// 具体装饰器 - 加糖
class Sugar extends CoffeeDecorator {public Sugar(Coffee coffee) {super(coffee);}@Overridepublic double cost() {return super.cost() + 0.2;}@Overridepublic String getDescription() {return super.getDescription() + ", Sugar";}
}

然后测试一下

public class Test {public static void main(String[] args) {// 点一杯浓缩咖啡Coffee espresso = new Espresso();System.out.println("Espresso: " + espresso.getDescription() + " - Cost: $" + espresso.cost());// 加牛奶Coffee espressoWithMilk = new Milk(espresso);System.out.println("Espresso with Milk: " + espressoWithMilk.getDescription() + " - Cost: $" + espressoWithMilk.cost());// 加糖Coffee espressoWithSugar = new Sugar(espresso);System.out.println("Espresso with Sugar: " + espressoWithSugar.getDescription() + " - Cost: $" + espressoWithSugar.cost());// 加牛奶和糖Coffee espressoWithMilkAndSugar = new Sugar(new Milk(espresso));System.out.println("Espresso with Milk and Sugar: " + espressoWithMilkAndSugar.getDescription() + " - Cost: $" + espressoWithMilkAndSugar.cost());}
}

运行结果

在这里插入图片描述

可以发现这个模式很好理解,看起来也比较实用的样子

http://www.lryc.cn/news/327574.html

相关文章:

  • Java基础知识总结(25)
  • Vue3 实现基于token 用户登录
  • 在word中显示Euclid Math One公式的问题及解决(latex公式,无需插件)
  • 江协科技STM32:按键控制LED光敏传感器控制蜂鸣器
  • 最佳矢量绘图设计软件Sketch for Mac v99.5 最新中文激活版
  • 【IntelliJ IDEA】运行测试报错解决方案(附图)
  • 【Kotlin】List、Set、Map简介
  • OpenCV 形态学处理函数
  • 互联网摸鱼日报(2024-03-27)
  • 2014年认证杯SPSSPRO杯数学建模B题(第二阶段)位图的处理算法全过程文档及程序
  • C++基本语法
  • Node Sass does not yet support your current environment
  • 长陆工业自动控制系统邀您到场参观2024第13届生物发酵产品与技术装备展
  • 数据仓库——维度表更新
  • Web3创作整理 - 2024-02-23 ~ 2024-03-25
  • CSS(一)---【CSS简介、导入方式、八种选择器、优先级】
  • 智慧公厕解决方案打造更加智能的卫生空间
  • 美团0316春招笔试题
  • typescript 实现RabbitMQ死信队列和延迟队列 订单10分钟未付归还库存
  • 怎样才能把重建大师的空三导进去CC?
  • 命令模式(请求与具体实现解耦)
  • 开发一款MMOARPG难度到底有多大
  • RTSP应用:实现视频流的实时推送
  • Java八股文(数据结构)
  • ActiveMQ Artemis 系列| High Availability 主备模式(消息复制) 版本2.19.1
  • QGIS插件系列--WhiteBox Tools
  • SpringMVC设置全局异常处理器
  • Acwing_795前缀和 【一维前缀和】+【模板】二维前缀和
  • docker 部署 gitlab-ce 16.9.1
  • 29.Python从入门到精通—Python3 面向对象继承 多继承 方法重写 类属性与方法