当前位置: 首页 > 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.xdnf.cn/news/1074493.html

相关文章:

  • 2.安装Docker
  • 怎样学习STM32
  • 暴力风扇方案介绍
  • HarmonyOS实战:自定义表情键盘
  • FPGA实现CameraLink视频解码,基于Xilinx ISERDES2原语,提供4套工程源码和技术支持
  • llama.cpp学习笔记:后端加载
  • 图书管理系统练习项目源码-前后端分离-使用node.js来做后端开发
  • Conda 环境配置之 -- Mamba安装(causal-conv1d、mamba_ssm 最简单配置方法)-- 不需要重新配置CDUA
  • 领域驱动设计(DDD)【26】之CQRS模式初探
  • AlpineLinux安装部署elasticsearch
  • Kafka4.0初体验
  • Python爬虫:Requests与Beautiful Soup库详解
  • 重写(Override)与重载(Overload)深度解析
  • 【C++】C++中的友元函数和友元类
  • 71. 简化路径 —day94
  • Bugku——WEB篇(持续更新ing)
  • documents4j导出pdf
  • Ubuntu服务器(公网)- Ubuntu客户端(内网)的FRP内网穿透配置教程
  • 数据结构 哈希表、栈的应用与链式队列 6.29 (尾)
  • 现代 JavaScript (ES6+) 入门到实战(八):总结与展望 - 成为一名现代前端开发者
  • day46/60
  • H3C-路由器交换机-中继
  • 计算机组成原理与体系结构-实验一 进位加法器(Proteus 8.15)
  • 5 c++核心——文件操作
  • MySQL技巧
  • 如何优化RK3588集群的性能?支持12个RK3588云手机阵列
  • C++ 格式化输入输出
  • Java中对JSON的操作
  • 模拟多维物理过程与基于云的数值分析-AI云计算数值分析和代码验证
  • SpringCloud系列(41)--SpringCloud Config分布式配置中心简介