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

设计模式之装饰者模式

目录

  • 定义
  • 结构
  • 适用场景
  • 使用示例

定义

       装饰者模式是一种‌结构型设计模式‌,它通过将对象放入包含行为的特殊封装对象中,从而‌动态地为原对象添加新功能‌。

结构

在这里插入图片描述

适用场景

1)‌动态扩展功能‌
       需要在运行时为对象灵活添加或撤销功能,且这些功能可自由组合。
‌        例如:为咖啡动态添加牛奶、糖、摩卡等配料。
2)‌避免继承爆炸‌
       当子类数量过多(如 MilkCoffee、SugarCoffee、MilkSugarCoffee…)时,装饰者模式提供更优雅的扩展方案。
3)‌不可修改原对象代码‌
       当无法修改原对象代码(如第三方库的类),但需扩展其行为时。
4)‌多层次功能叠加‌
       功能需要按不同顺序组合(如先加糖再加牛奶 vs 先加牛奶再加糖)。

使用示例

以下是装饰者模式在IO中的简化示例。
定义抽象组件

import java.io.IOException;/*** 抽象组件*/
public interface InputStream {int read() throws IOException;void close() throws IOException;}

定义具体组件

import java.io.IOException;public class FileInputStream implements InputStream {private String filename;public FileInputStream(String filename) {this.filename = filename;}@Overridepublic int read() throws IOException {System.out.println("从文件" + filename + "读取字节");return 0; // 模拟返回字节}@Overridepublic void close() throws IOException {System.out.println("关闭文件" + filename);}
}

定义抽象装饰者

import java.io.IOException;/*** 抽象装饰者*/
public abstract class FilterInputStream implements InputStream {protected InputStream wrappee;public FilterInputStream(InputStream in) {this.wrappee = in;}@Overridepublic abstract int read() throws IOException;@Overridepublic void close() throws IOException {wrappee.close();}
}

定义具体装饰者

import java.io.IOException;/*** 具体装饰者A*/
public class BufferedInputStream extends FilterInputStream {public BufferedInputStream(InputStream in) {super(in);}@Overridepublic int read() throws IOException {System.out.println("从缓冲区读取字节");return wrappee.read();}
}
import java.io.IOException;/*** 具体装饰者B*/
public class DataInputStream extends FilterInputStream {public DataInputStream(InputStream in) {super(in);}@Overridepublic int read() throws IOException {System.out.println("读取并转换数据类型");return wrappee.read();}public String readUTF() throws IOException {return "装饰后的字符串数据";}
}

测试

import java.io.IOException;public class Client {public static void main(String[] args) throws IOException {InputStream in = new FileInputStream("test.txt");in = new BufferedInputStream(in);in = new DataInputStream(in);in.read();System.out.println(((DataInputStream) in).readUTF());in.close();}}
http://www.lqws.cn/news/565687.html

相关文章:

  • 企业级路由器技术全解析:从基础原理到实战开发
  • promise深入理解和使用
  • 线性相关和线性无关
  • 【数据挖掘】聚类算法学习—K-Means
  • Windows 4625日志类别解析:未成功的账户登录事件
  • 节点小宝:告别公网IP,重塑你的远程连接体验
  • 数据库 DML 语句详解:语法与注意事项
  • Android大图加载优化:BitmapRegionDecoder深度解析与实战
  • 【分布式 ID】生成唯一 ID 的几种方式
  • 面试150 螺旋矩阵
  • 模拟工作队列 - 华为OD机试真题(JavaScript卷)
  • llama.cpp学习笔记:后端加载
  • Windows系统安装鸿蒙模拟器
  • 接口自动化测试(Python+pytest+PyMySQL+Jenkins)
  • OpenLayers 全屏控件介绍
  • Wpf布局之StackPanel!
  • Mac电脑手动安装原版Stable Diffusion,开启本地API调用生成图片
  • 在Mac上查找并删除Java 21.0.5
  • 【Canvas与标志】圆规脚足球俱乐部标志
  • Spring Cloud Gateway 实战:从网关搭建到过滤器与跨域解决方案
  • 浮油 - 3 相分层和自由表面流 CFX 模拟
  • 医疗AI智能基础设施构建:向量数据库矩阵化建设流程分析
  • js 基础
  • PCB工艺学习与总结-20250628
  • JVM——垃圾回收
  • Kafka4.0初体验
  • 系统架构设计师备考之架构设计专业知识
  • 软考 系统架构设计师系列知识点之杂项集萃(100)
  • TCP/UDP协议深度解析(三):TCP流量控制的魔法—滑动窗口、拥塞控制与ACK的智慧
  • Cursor 教程:用 Cursor 创建第一个 Java 项目