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

装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给对象添加新的行为,而不改变其结构。以下是一个用 Java 实现的装饰器模式示例:

示例:咖啡店

假设你有一个咖啡店,咖啡有不同的类型(如 Espresso、Latte),并且可以添加不同的调料(如牛奶、糖、巧克力)。你希望能够动态地给咖啡添加这些调料。

代码实现

  1. 创建 Beverage 接口:这是所有饮料类的公共接口。
public interface Beverage {String getDescription();double cost();
}
  1. 创建具体的饮料类:如 Espresso 和 Latte。
public class Espresso implements Beverage {@Overridepublic String getDescription() {return "Espresso";}@Overridepublic double cost() {return 1.99;}
}public class Latte implements Beverage {@Overridepublic String getDescription() {return "Latte";}@Overridepublic double cost() {return 2.99;}
}
  1. 创建装饰器抽象类:所有的调料装饰器都需要继承这个类。
public abstract class CondimentDecorator implements Beverage {protected Beverage beverage;public CondimentDecorator(Beverage beverage) {this.beverage = beverage;}@Overridepublic String getDescription() {return beverage.getDescription();}@Overridepublic double cost() {return beverage.cost();}
}
  1. 创建具体的装饰器类:如牛奶和巧克力。
public class Milk extends CondimentDecorator {public Milk(Beverage beverage) {super(beverage);}@Overridepublic String getDescription() {return beverage.getDescription() + ", Milk";}@Overridepublic double cost() {return beverage.cost() + 0.5;}
}public class Chocolate extends CondimentDecorator {public Chocolate(Beverage beverage) {super(beverage);}@Overridepublic String getDescription() {return beverage.getDescription() + ", Chocolate";}@Overridepublic double cost() {return beverage.cost() + 0.7;}
}
  1. 客户端代码:使用装饰器模式来创建饮料,并添加调料。
public class CoffeeShop {public static void main(String[] args) {// 创建一个Espresso,不加任何调料Beverage beverage = new Espresso();System.out.println(beverage.getDescription() + " $" + beverage.cost());// 创建一个加牛奶的LatteBeverage latteWithMilk = new Milk(new Latte());System.out.println(latteWithMilk.getDescription() + " $" + latteWithMilk.cost());// 创建一个加牛奶和巧克力的EspressoBeverage espressoWithMilkAndChocolate = new Chocolate(new Milk(new Espresso()));System.out.println(espressoWithMilkAndChocolate.getDescription() + " $" + espressoWithMilkAndChocolate.cost());}
}

输出结果

Espresso $1.99
Latte, Milk $3.49
Espresso, Milk, Chocolate $3.19

这个例子展示了如何使用装饰器模式来动态地给对象添加功能。在这个例子中,每个调料(如牛奶和巧克力)都作为一个装饰器,通过组合的方式与基本饮料对象(如 Espresso 和 Latte)组合在一起,从而实现了功能的扩展。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 4.2 Sensors -- onKeyStroke
  • 网络安全:键盘记录器
  • 算法训练营|图论第8天 拓扑排序 dijkstra
  • (二十六)Java 数据结构
  • 山东省行政执法证照片要求及图像处理方法
  • 暑期学习总结
  • Android 11添加系统服务,并封装jar包供第三方应用使用
  • Kafka【五】Buffer Cache (缓冲区缓存)、Page Cache (页缓存)和零拷贝技术
  • python与pytroch相关
  • linux 下一跳缓存,early demux(‌早期解复用)‌介绍
  • 探索PDF的奥秘:pdfrw库的神奇之旅
  • 32 配置多路由的静态路由
  • https和harbor仓库跟k8s
  • VsCode + Go + macOS 小白 demo运行
  • 浏览器自动化测试的利器:Cypress
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 10个确保微服务与容器安全的最佳实践
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CAP 一致性协议及应用解析
  • Django 博客开发教程 8 - 博客文章详情页
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • HTTP 简介
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • mongo索引构建
  • underscore源码剖析之整体架构
  • 阿里研究院入选中国企业智库系统影响力榜
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 浅谈web中前端模板引擎的使用
  • 入口文件开始,分析Vue源码实现
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 微信小程序设置上一页数据
  • 中文输入法与React文本输入框的问题与解决方案
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​水经微图Web1.5.0版即将上线
  • #、%和$符号在OGNL表达式中经常出现
  • #HarmonyOS:软件安装window和mac预览Hello World
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (23)Linux的软硬连接
  • (52)只出现一次的数字III
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Qt) 默认QtWidget应用包含什么?
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (苍穹外卖)day03菜品管理
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (二十三)Flask之高频面试点
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (六)c52学习之旅-独立按键
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (转)Google的Objective-C编码规范
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。