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

设计模式--装饰器模式


装饰器模式


装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许我们向一个现有的对象添加新的功能,同时又不改变其结构。就增加功能来说,装饰器模式相比生成子类更为灵活。这种模式创建了一个包装对象,也就是装饰器,来包裹真实的对象。


装饰器模式的主要组成部分


组件接口(Component):定义一个对象接口,可以给这些对象动态地添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
具体组件(ConcreteComponent):定义了一个具体的对象,也可以给这个对象添加一些职责。
装饰角色(Decorator):持有一个组件(Component)对象的引用,并定义一个与组件接口一致的接口。
具体装饰角色(ConcreteDecorator):负责给组件添加新的职责。


装饰器模式的工作方式


装饰器类:继承自装饰器角色类,它包含一个指向组件对象的引用,并定义了一个与组件接口一致的接口。
具体装饰器:负责给组件添加新的功能。
优点
扩展性:装饰器模式提供了比继承更有弹性的替代方案(扩展)。
灵活性:通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。
缺点
多层装饰较复杂:如果多层装饰器嵌套,可能会导致调用栈过深,从而影响性能。
案例:
假设我们有一个咖啡类,它提供基本的咖啡类型(如美式、拿铁),我们想要通过装饰器模式给咖啡添加额外的功能,比如加奶泡、加糖等。

// 具体组件

interface Coffee {  double getCost();  String getDescription();  
}  // ConcreteComponent  
class SimpleCoffee implements Coffee {  private String description = "Simple Coffee";  @Override  public double getCost() {  return 2.0;  }  @Override  public String getDescription() {  return description;  }  
} 

// 装饰角色

abstract class CoffeeDecorator implements Coffee {  protected Coffee decoratedCoffee;  public CoffeeDecorator(Coffee decoratedCoffee) {  this.decoratedCoffee = decoratedCoffee;  }  @Override  public double getCost() {  return decoratedCoffee.getCost();  }  @Override  public String getDescription() {  return decoratedCoffee.getDescription();  }  
}  

// 具体装饰角色

class MilkCoffee extends CoffeeDecorator {  public MilkCoffee(Coffee decoratedCoffee) {  super(decoratedCoffee);  }  @Override  public double getCost() {  return super.getCost() + 0.5;  }  @Override  public String getDescription() {  return super.getDescription() + ", Milk";  }  
}  

// 具体装饰角色

class SugarCoffee extends CoffeeDecorator {  public SugarCoffee(Coffee decoratedCoffee) {  super(decoratedCoffee);  }  @Override  public double getCost() {  return super.getCost() + 0.3;  }  @Override  public String getDescription() {  return super.getDescription() + ", Sugar";  }  
}  

// 客户端调用

public class DecoratorPatternDemo {  public static void main(String[] args) {  Coffee coffee = new SimpleCoffee();  coffee = new MilkCoffee(coffee);  coffee = new SugarCoffee(coffee);  System.out.println(coffee.getDescription() + " $" + coffee.getCost());  }  
}

在这个例子中,SimpleCoffee 是具体的组件,CoffeeDecorator 是装饰器角色,而 MilkCoffee 和 SugarCoffee 是具体的装饰器,它们给咖啡添加了新的功能(加奶泡、加糖)而不需要修改 SimpleCoffee 的代码。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python脚本开头怎么写
  • 【零知识证明】MiMC哈希函数电路
  • 罗素悖论 是集合论中的一个经典悖论
  • 【C语言】十六进制、二进制、字节、位
  • 【论文阅读】Single-Stage Visual Query Localization in Egocentric Videos
  • 一键编译QT5源码脚本(交叉编译arm64、mips64版本)
  • 春秋云镜(ZZCMS 2023)·CVE-2023-50104
  • 深入探究Nginx中的URL哈希负载均衡策略
  • 引用和类型强转
  • Java算法之快速排序(Quick Sort)
  • AMD Zen 5 微架构及其市场策略
  • 简单排序(sort)
  • Openstack 与 Ceph集群搭建(完结): 配置Ceph作为Openstack后端存储
  • 如何打造基于Java SpringBoot和Vue的医院门诊智能预约平台?四步实现高效就医流程,整合MySQL数据库,优化用户体验。
  • 功能测试常用的测试用例大全
  • 【翻译】babel对TC39装饰器草案的实现
  • 【技术性】Search知识
  • 【面试系列】之二:关于js原型
  • ECMAScript6(0):ES6简明参考手册
  • httpie使用详解
  • JavaScript函数式编程(一)
  • JavaScript类型识别
  • JS函数式编程 数组部分风格 ES6版
  • session共享问题解决方案
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 前端攻城师
  • 使用API自动生成工具优化前端工作流
  • 突破自己的技术思维
  • 微信小程序实战练习(仿五洲到家微信版)
  • 温故知新之javascript面向对象
  • 小李飞刀:SQL题目刷起来!
  • 异常机制详解
  • 怎么把视频里的音乐提取出来
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​Spring Boot 分片上传文件
  • ​虚拟化系列介绍(十)
  • ![CDATA[ ]] 是什么东东
  • #if等命令的学习
  • #laravel 通过手动安装依赖PHPExcel#
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (ZT)一个美国文科博士的YardLife
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)EOS中账户、钱包和密钥的关系
  • (转)http协议
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 服务 ServiceController
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件