news 2026/11/3 9:09:52

【设计模式】继承的替代方式:装饰者模式-动态丰富对象功能,而不是实现大量的继承实例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【设计模式】继承的替代方式:装饰者模式-动态丰富对象功能,而不是实现大量的继承实例

了解一些使用案例,并写一些例子,对装饰者模式有一个入门。

1. 装饰者模式

装饰者模式是继承关系的一个替代方案,它可以动态地将功能附加到对象上,提供了比继承更有弹性的替代方案。

适用场景:

需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实,这时需要装饰者模式。

装饰者模式的作用:

  1. 可以动态地给一个对象添加一些额外的职责;
  2. 可以增加一些基础功能而组合大量的功能(这是继承实现不了的)。

2. 使用案例:

2.1. java的IO流

其中buffer附加了缓冲区的功能、InputStream附加了编码方式,而实际读取文件的还是FileInputStream,前两者只是增强或是丰富了功能。

2.2. spark的RDD算子


实际触发执行的是collect算子。
与javaIO不同的是:RDD可自定义每个算子的处理逻辑:即控制抽象。而java IO如上是直接拿来用的。
控制抽象:将封装的逻辑打包发给它,它便具有了此功能。

3. 实现装饰者

3.1. 需求描述

3.2. 逻辑描述

  • drink是咖啡种类抽象类,具体的咖啡种类可以通过继承实现;
  • decorator是装饰的逻辑:定义了具体那种咖啡和口味是如何组合的逻辑,并且根据不同的口味继承实现不同的组合逻辑
  • 通过以组合的方式可以动态实现:不同口味的各种咖啡

咖啡的抽象与实现

publicabstractclassDrink{publicStringdes;//要添加的口味privatefloatprice=0.0f;//... set and get: des and price//计算费用的抽象方法//子类来实现publicabstractfloatcost();}publicclassDeCafextendsDrink{publicDeCaf(){setDes(" 无因咖啡 ");setPrice(1.0f);}}

口味的实现与抽象

//装饰者: 组装口味和Drink的逻辑//通过继承drink使得装饰者也有drink的属性publicclassDecoratorextendsDrink{privateDrinkobj;//继承+组合publicDecorator(Drinkobj){//组合this.obj=obj;}@Overridepublicfloatcost(){// 单品价格(单品实现了父类,通过父类方法获取单品价格)+装饰价格returnsuper.getPrice()+obj.cost();}@OverridepublicStringgetDes(){// obj.getDes() 输出被装饰者的信息returndes+" "+getPrice()+" && "+obj.getDes();}}//具体的Decorator, 这里具体指巧克力口味publicclassChocolateextendsDecorator{publicChocolate(Drinkobj){super(obj);setDes(" 巧克力 ");setPrice(3.0f);// 调味品 的价格}}

client调用

Drinkorder2=newDeCaf();System.out.println("order2 无因咖啡 费用 ="+order2.cost());System.out.println("order2 无因咖啡 描述 = "+order2.getDes());order2=newChocolate(order2);System.out.println("order2 无因咖啡 加入一份Chocolate 费用 ="+order2.cost());System.out.println("order2 无因咖啡 加入一份Chocolate 描述 = "+order2.getDes());
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 9:09:00

AI服务器电源技术路线与产业格局:从12V到800V HVDC的演进

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:09:00

STM32F042K6与MAX14431BAEE+的SPI隔离方案设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:08:16

智能家居硬件开源项目:四大渠道拆解与从零到进阶实操路线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:07:36

隔离SPI通信实战:MAX14431BAEE+与PIC18F4680的硬件设计与时序优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:07:34

工业现场SPI通信隔离设计:从STM32到MAX14431的完整链路实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华