设计模式之装饰模式

2023-11-13

网上说JDK中的I/O设计是最标准的装饰模式,所以今天打算研究一些装饰模式,乍一看怎么感觉和代理模式这么像呢? 

1.为什么需要装饰模式

在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

2.简介

装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。

装饰模式由4种角色组成:
1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加职责的对象。
2)具体构件(Concrete Component)角色:定义一个将要接收附加职责的类。
3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口,从外类来扩展Component类的功能,但对于Component类来说,是无需知道Decorato的存在的。
4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的职责。

UML类图


3.分类



4.应用

1)给人搭配不同的服饰

//Component
public interface IPerson{
    public void show();
}
//ConcreteComponent
public class Person implements IPerson{    
    private String name;  
    public Person(String name){  
        this.name = name;  
    }    
    public void show(){  
        System.out.println("装扮的"+name);  
    }  
}  
// 服饰类(Decorator)  
public abstract class Finery implements Person {  
    protected IPerson person;  
    public Finery(IPerson person){
        this.person = person;
    } 
    @Override  
    public void show() {  
        person.show();
    }  
}  
// 具体服饰类(ConcreteDecorator)
public class TShirts extends Finery {
    public TShirts(IPerson person){
        super(person); //必须重写构造函数,否则报错
    }
    @Override  
    public void show() {  
        System.out.println("大T恤");  
        super.show(); // 必须加,否则不会依次调用
    }  
}   
// 具体服饰类(ConcreteDecorator) 
public class BigTrouser extends Finery {
    public BigTrouser(IPerson person){
        super(person);
    }
    @Override  
    public void show() {  
        System.out.println("大长裤");  
        super.show();  
    }  
}  
// 客户端代码 
public class Demo {  
    public static void main(String[] args) {  
        IPerson person = 
            new TShirts(new BigTrouser(new Person("桑科")));
        person.show();
        // 运行结果: 大T恤 大长裤 装扮的桑科 
    }  
}  
2)经典demo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之装饰模式 的相关文章

  • GIT的使用

    GIT 的常规操作 常规操作也是我自己平时常用的几个命令 学自于 pro git 这本书中 git 配置文件 git的配置文件位置 针对所有用户 etc gitconfig 针对当前用户 gitconfig 查看配置的方法 git conf
  • 图像匹配算法

    图像匹配算法分为3类 基于灰度的匹配算法 基于特征的匹配算法 基于关系的匹配算法 1 基于灰度的模板匹配算法 模板匹配 Blocking Matching 是根据已知模板图像到另一幅图像中寻找与模板图像相似的子图像 基于灰度的匹配算法也称作
  • PowerShell 语法

    PowerShell是微软公司开发的一种任务自动化和配置管理框架 基于 NET框架 以下是PowerShell的一些常用语法 命令语法 标准命令语法 如 Get ChildItem 活动目录命令语法 如 Get ADUser 参数 格式为
  • 人生苦短,我用python

    如果你看到一个人穿着一个短袖 短袖上面印着 人生苦短 我用python 不用怀疑 他一定是一个python程序员 作为编程热门语言排行榜首的python 有着强大的粉丝社区 因为它的简洁 越来越多的人喜欢上了它 而这个语言 就是由吉多 范罗
  • Springboot内置Tomcat线程数测试

    SpringBoot 2 7 3 本文主要介绍SpringBoot内置Tomcat的主要参数 解析最大线程数和最大连接数的作用方式 SpringBoot各版本的参数配置可能不完全一样 本文以2 7 3版本为例进行试验 一 默认配置 Spri
  • python实验一

    1 输入带有py的字符串 替换其中出现的字符串py为python输出替换后的字符串 s input 输入带有py的字符串 print s replace py python 运行结果 2 获得用户输入的一个字符串 请输出其全小写形式 s i
  • python学习(1)图像处理指令解析

    1 img i j c i表示图片的行数 j表示图片的列数 c表示图片的通道数 RGB三通道分别对应0 1 2 坐标是从左上角开始 灰度图片访问方式为 gray i j 2 生成椒盐噪声 from skimage import io dat
  • printf标识总结(转)

    printf标识总结 转 Dev C 下基本数据类型学习小结 环境 Dev C 4 9 6 0 gcc mingw32 使用 Wall编译选项 基本类型包括字节型 char 整型 int 和浮点型 float double 定义基本类型变量
  • RFID盘点机如何使用

    RFID盘点机如何使用 在我们的生活中 RFID技术应用广泛 比如固定资产管理 一套完整的RFID系统主要包含RFID系统 RFID打印机 RFID读写器 RFID盘点机 RFID标签 缺一不可 作为RFID系统中的重要主成部分 RFID盘
  • C# 不定长参数

    C 不定长参数 C 提供一种语法 允许你设计的一个函数可以支持传入不定长的参数 例如一个用于整数计算的Add方法 可以将传入的参数累加起来 如 Add 1 2 返回3 Add 1 2 3 放回6 代码是这样的 使用params int i作

随机推荐

  • 自动化测试,除了coding还需要掌握什么?

    一 自动化测试项目 自动化测试本身是一个项目 它属于业务项目的子项目 因此自动化测试项目也具有项目所有的特征 既然提到自动化测试是一个项目 那么首先需要大家理解一下为什么叫做自动化测试项目 而不单单是自动化测试 1 1 软件项目生命周期 首
  • VMware虚拟机复制文件卡死的问题

    又遇到这个问题了 于是决定解决它 在这里记录下过程 百度了一下好像是因为win10更新的原因 有人给出的对策是把虚拟机更新到15 1 不过有人更新完之后还是出问题了 懒得又卸载了重新安装 所以还是决定用文件共享的方式解决算了 或者尝试先把文
  • H5 ios10+ Safari 中实现 video/audio 自动播放小技巧

    关于Safari 中禁止音视频自动播放的问题 apple 开发者声明 https developer apple com library archive documentation AudioVideo Conceptual Using H
  • QLoRA:量化 LLM 的高效微调

    此 repo 支持论文 QLoRA 量化 LLM 的高效微调 旨在使对 LLM 研究的访问民主化 QLoRA 使用bitsandbytes进行量化 并与 Hugging Face 的PEFT和transformers库集成 QLoRA 由华
  • XXE漏洞利用技巧(由简入深)-----portswigger(XXE部分WP)

    什么是XXE XXE XML External Entity xml外部实体注入 它出现在使用XML解析器的应用程序中 XXE攻击利用了XML解析器的功能 允许应用程序从外部实体引用加载数据 攻击者可以通过构造恶意的XML实体引用来读取本地
  • 后台管理系统-canvas添加水印

    展示 第一步 untils文件 gt 创建一个shuiying js 第二步 shuiying js gt 代码 const watermark const setWatermark str str1 gt const id 1 23452
  • 用jemalloc代替glibc默认ptmalloc进一步提升服务器性能和负载

    启动redis时 无意中看到redis的启动信息有一个jemalloc的版本信息 处于好奇了解了一下 它是一个进一步提升服务器负载和性能的神器 一 Ptmalloc Linux 系统在装载 elf 格式的程序文件时 会调用 loader 把
  • win7下连接共享打印机的方法(终于解决了)

    1 首先一定要确保Spooler服务启动 2 随便找个添加打印机的地方 我是在控制面板找的 3 点击 添加打印机 后选择 添加网络打印机 进来一般来说搜不到你想要连接的打印机 这时候点击 我想要连接的打印机不再列表中 点击 通过共享选择一个
  • OnTriggerEnter 当进入触发器

    当Collider 碰撞体 进入trigger 触发器 时调用OnTriggerEnter 这个消息被发送到触发器碰撞体和刚体 或者碰撞体假设没有刚体 注意如果碰撞体附加了一个刚体 也只发送触发器事件 销毁所有进入触发器的物体 void O
  • 10.netty客户端与服务器使用protobuf传输报文

    README 本文总结自B站 尚硅谷 netty 很不错 内容如下 netty的编码器与解码器 netty客户端与服务器通过 protobuf 传输报文的开发方式 文末po出了所有代码 1 netty的编码器与解码器 codec 1 编解码
  • (1)docker的使用 阿里镜像 运行jar包 springboot

    前言 在运行jar包时 我的 中台 建议使用docker进行运行 于是查阅资料 将这个过程进行记录如下 对于入门小白 共勉 安装docker 由于是第一次安装 所以借鉴了大牛的帖子 当然 大牛帖子也有缺点 就是一旦被大家认可 更新不及时 该
  • BGP基础

    简述 在EGP协议中 引入了AS Autonomous System 自治系统 的概念 AS是指由同一个技术管理机构管理 使用统一选路策略的一些路由器的集合 AS的内部使用IGP来计算和发现路由 同一个AS内部的路由器之间是相互信任的 因此
  • win10笔记蓝屏VIDEO_DXGKRNL_ERROR解决思路

    今天笔记本插电正常开机 打开怪物猎人游戏后提示缺少DirectX11 很疑惑 因为以前从来没有报这个错 随后过了不久笔记本就蓝屏 且始终不会自己重新启动 网上查了查都说是显卡硬件的问题 说什么显卡烧坏了 让拿去线下售后店修理 说的都很玄乎
  • 30天入门Python(基础篇)——第2天:Python安装(保姆级)与IDE的认识与选择+详细安装教程

    文章目录 专栏导读 上一节课回顾 1 Python解释器的安装 查看各个版本的Python解释器 ok 双击安装 这里我们选择 自定义 安装 下面的 将Python添加在环境变量 大家一定要打个勾 点击 Next 进行下一步 这里不建议安装
  • 《C++ Primer》学习笔记

    这次一定要完整学完 2022 8 24 像编辑器一样思考和理解C C 的编程风格 C风格 基于对象 面向对象 泛型和基于组件 初学建议 C Primer 和 C 标准程序库 Scott Meyers的 Effective C Anthony
  • Direct local .aar file dependencies are not supported when building an AAR.

    前言 起因 项目中含有视频播放功能 使用的是GSYVideoPlayer 因为公司网络问题经常依赖添加不了 所以将关于它的aar包全部下载下来直接本地依赖 因为多个业务都可能涉及视频播放功能 为了复用 就想着将视频播放的功能提取出来 通过F
  • 计算机vfp系统,计算机等级考试VFP教程:第一章数据库系统

    1 数据处理 数据 是对事实 概念或指令的一种特殊表达形式 可以用人工的方式或自动化的装置进行通信 翻译转换或者进行加工处理 它包括两类 一类是能参与数字运算的数值型数据 一类是不能参与数字运算的非数值型数据 如文字 图画 声音 活动图象等
  • 动态扩容Linux根目录 (解决/dev/mapper/cl_192-root 占用了过高问题)

    相信大家在运维centos服务器的时候经常会遇到根目录空间不足的现象 今天本人就针对此问题给出一个调整root分区大小的方案 操作如下 1 首先 必须确保其他分区有足够的空间用来分给根目录 可以使用以下命令查看 sudo df h 可以看到
  • java addservlet_Java ServletContext.addServlet方法代碼示例

    本文整理匯總了Java中javax servlet ServletContext addServlet方法的典型用法代碼示例 如果您正苦於以下問題 Java ServletContext addServlet方法的具體用法 Java Ser
  • 设计模式之装饰模式

    网上说JDK中的I O设计是最标准的装饰模式 所以今天打算研究一些装饰模式 乍一看怎么感觉和代理模式这么像呢 1 为什么需要装饰模式 在不必改变原类文件和使用继承的情况下 动态地扩展一个对象的功能 它是通过创建一个包装对象 也就是装饰来包裹