这是我见过最通俗易懂的装饰者模式讲解!

news2025/2/12 21:34:54

关注“Java架构栈”微信公众号,回复暗号【Java面试题】即可获取大厂面试题

 前言

本文主要讲述装饰者模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。

 什么是装饰者模式

装饰者模式是23种设计模式中结构型模式的一种,它的核心思想是在不必改变类文件及不使用继承的情况下,通过装饰者包裹目标对象,动态地扩展目标对象的功能。

 生活中的装饰者器模式

1.钢铁侠

托尼斯塔克,漫威著名的超级英雄钢铁侠,也是斯塔克工业的拥有者,还是著名的富豪和花花公子。问每个男人想成为漫威的哪个超级英雄,十个有九个会说想成为钢铁侠,剩下的那个可能是想成为绿巨人。江帅也是想成为钢铁侠之一的男人,毕竟有钱又聪明还那么酷炫,谁能抵抗得了呢。

钢铁侠最出名的就是他的钢铁战衣,而只有穿戴上钢铁战衣的托尼斯塔克才是钢铁侠,通过钢铁战衣让自己成为钢铁侠,做到一些普通人完成不了的事。这样的钢铁侠就跟设计模式中的装饰者模式类似。

2.蝙蝠侠

布鲁斯韦恩,DC著名的超级英雄蝙蝠侠,同样也是哥谭市的首富,拥有著名的能力:钞能力。相比于钢铁侠来说,蝙蝠侠有着出色的格斗技巧,但是人生过得比钢铁侠黑暗得多,这或许是DC的特点。

同样穿上了蝙蝠装的布鲁斯韦恩才是蝙蝠侠,通过蝙蝠装和蝙蝠车这些装备让布鲁斯韦恩变得更加强大,再结合自身强大的格斗能力把哥谭的反派们整得服服帖帖。这样的蝙蝠侠就跟设计模式中的装饰者模式类似。

3.黑豹

瓦坎达万岁!这句话出自漫威的瓦坎达王国,瓦坎达国王也是漫威超级英雄之一,更是一个比钢铁侠更有钱的人,可以说是漫威最富有的超级英雄。

穷人靠变异,富人靠科技,而黑豹这个顶级富豪又靠变异又靠科技,打破了这句话。虽然黑豹如此强大,但是依旧挡不住江帅喜欢钢铁侠的心。心形草+黑豹装两者结合才是漫威英雄黑豹,而由心形草和黑豹装增强的黑豹就跟设计模式中的装饰者模式类似。

 装饰者模式的实现

接下来咱们以钢铁侠来举例,首先创建抽象组件和具体组件

package com.qianfeng.ran;

/*
 * @author:江帅
 *      抽象组件
 *          人类
 */
public abstract class Human {
    //行为方法
    public abstract void behavior();
}


/*
 * @author:江帅
 *      具体组件类
 *          托尼斯塔克
 */
class TonyStark extends Human{
    //拯救世界的行为
    @Override
    public void behavior() {
        System.out.println("运用科技和财富拯救世界");
    }
}

再创建抽象装饰者和装饰者具体实现类。

package com.qianfeng.ran;

/*
 * @author:江帅
 *      抽象装饰者
 *          超级英雄类
 */
public abstract class Superhero extends Human{
    private Human human;
    //获取被装饰对象
    public Superhero(Human human) {
        this.human = human;
    }

    @Override
    public void behavior() {
        //执行目标对象原本的行为
        human.behavior();
    }
}


/*
 * @author:江帅
 *      具体装饰者类
 *          钢铁侠类
 */
class IronMan extends Superhero {
    public IronMan(Human human) {
        super(human);
    }

    //增强目标对象的行为
    @Override
    public void behavior() {
        super.behavior();
        System.out.println("穿戴钢铁战衣拯救世界");
    }
}

最后我们通过装饰者模式,来模拟没有钢铁战衣的托尼斯塔克和有钢铁战衣的区别。

package com.qianfeng.ran;

/*
 * @author:江帅
 *          客户端
 */
public class Demo {
    public static void main(String[] args) {
        //创建托尼斯塔克对象
        TonyStark tonyStark = new TonyStark();
        //执行结果:
        //运用科技和财富拯救世界
        tonyStark.behavior();

        //通过装饰者模式使托尼斯塔克对象装饰成钢铁侠对象
        IronMan ironMan = new IronMan(tonyStark);
        //执行结果:
        //运用科技和财富拯救世界
        //穿戴钢铁战衣拯救世界
        ironMan.behavior();
    }
}

 配套视频

如果你不习惯阅读技术文章,或是对文中的技术概念不能很好地理解,可以来看看江帅帮你筛选出的视频教程。

👇扫码立即学习👇

 总结

使用装饰者模式可以动态地给目标对象添加功能,或者在原有的功能上使之更加强大,而这些功能也能动态的撤销。当不便于使用继承方式增强对象的功能,或者使用继承后不便于扩展和维护,装饰者模式就是一种很好的模式。

在IO流中,包装流使用的就是装饰者模式,例如:BufferedInputStream、BufferedOutputStream、BufferedWriter、BufferedReader等等。

下一章,江帅将带大家学习经纪人的工作(设计模式之代理模式)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter如何进行http压力测试

目录 前言: 1、添加线程组: 2、添加采样器: 3、添加监视器 压力测试知识说明 前言: JMeter是一个基于Java的开源压力测试工具,可用于评估Web应用程序的性能,包括HTTP、HTTPS、FTP、SOAP、Restful、JD…

试试前端自动化测试(基础篇)

众所周知的原因,前端作为一种特殊的 GUI 软件,做自动化测试困难重重。在快速迭代,UI 变动大的业务中,自动化测试想要落地更是男上加男 🐶。 近期的学习过程中,翻阅了众多前端自动化测试相关的文章&#xf…

JAVA中的拦截器、过滤器

JAVA变成拦截器、过滤器 一、拦截器1、简介说明2、源码及方法说明3、拦截器自定义应用 二、过滤器1、简介说明2、源码及方法说明3、过滤器的自定义应用 三、Springboot中的WebMvcConfigurer1、简介2、主要方法3、添加拦截器 四、区别1、原理2、触发3、其他 一、拦截器 1、简介…

Scala学习笔记

累了,基础配置不想写了,直接抄了→Scala的环境搭建 这里需要注意的是,创建新项目时,不要用默认的Class类,用Object,原因看→scala中的object为什么可以直接运行 一、Scala简介 1.1 图解Scala和Java的关系 1…

HQChart实战教程63-自定义手机端K线tooltip显示数据

HQChart实战教程63-自定义手机端K线tooltip显示数据 手机端K线tooltip步骤1. 配置手机端tooltip2. 替换k线tooltip格式化输出函数2. 格式化输出函数说明HQChart插件源码地址完整的demo源码手机端K线tooltip hqchart手机端内置一个tooltip,显示手势所在K线的信息。默认显示 日期…

了解D-Galactopyranose pentaacetate,CAS号25878-60-8的性质和应用

​ 中文名称:1,2,3,4,6-D-葡萄糖五乙酸酯 英文名称:D-Galactopyranose pentaacetate 规格标准:1g、5g、10g CAS:25878-60-8 分子式:C16H22O11 分子量:390.34 熔点:113C 沸点:451C 密…

迷宫生成算法

迷宫生成 ① 十字分割 递归版本 ② BFS(即广度算法) 十字分割方法生成 要求初始时迷宫内全是通路,然后随机十字建墙,然后随机在三面墙上打洞,使四个子空间连通。 要求:十字点横纵坐标均要求为偶数&…

【unity】URP的shader开发中支持多光源,_ADDITIONAL_LIGHTS_VERTEX 和 _ADDITIONAL_LIGHTS 区别

项目里有一个其他同事实现的shader&#xff0c;美术那边希望能支持多个光源&#xff0c; 我一看代码里面&#xff0c; frag 函数里已经实现了 #ifdef _ADDITIONAL_LIGHTSuint pixelLightCount GetAdditionalLightsCount();for (uint lightIndex 0u; lightIndex < pixelL…

什么决定了我们的命运?

一、什么决定了我们的命运&#xff1f; 一个学生时代看起来特别优秀的人&#xff0c; 后来成了特别平凡的人&#xff1b; 而那时候看起来平淡无奇的一些人&#xff0c; 后来做出了一些似乎超越了他水平的事情。 不禁想问&#xff0c;到底是什么决定了我们的命运&#xff1f; 关…

Transformer在CV领域有可能替代CNN吗?

目前已经有基于Transformer在三大图像问题上的应用&#xff1a;分类&#xff08;ViT&#xff09;&#xff0c;检测&#xff08;DETR&#xff09;和分割&#xff08;SETR&#xff09;&#xff0c;并且都取得了不错的效果。那么未来&#xff0c;Transformer有可能替换CNN吗&#…

uniapp创建vue3项目(持续更新)

一.项目全局配置 1. 创建项目 使用Hbuilderx工具创建项目, 使用Hbuilderx工具创建项目&#xff0c;选择uni-ui项目模版&#xff0c;VUE3 2.底部菜单栏配置tabBar uniapp官网&#xff1a; 全局文件--pages.json页面路由 -- tabBar 项目文件&#xff1a;pages.json--文件底部…

MM32F3273G8P火龙果开发板MindSDK开发教程18 -sfud库的移植

MM32F3273G8P火龙果开发板MindSDK开发教程18 -sfud库的移植 1、sfud简介 SFUD (Serial Flash Universal Driver) 串行 Flash 通用驱动库 推荐查看官方文档&#xff1a;一款使用 JEDEC SFDP 标准的串行 (SPI) Flash 通用驱动库 2、实验设备 主控&#xff1a;MM32F3273G8P火龙…

Matlab与ROS---深度学习(九)

0. 简介 在了解完上面8讲内容后&#xff0c;基本上ROS和Matlab最关键的部分已经介绍完毕。我们最后一讲就来简单的讲述一下如何在Matlab中结合ROS来完成障碍物的识别与检测。 1. 在Matlab中使用CUDA 配置SimulinkCoder以从Simulink模型生成和构建的CUDA的ROS节点是我们这一小…

如何选择接口测试工具?

目录 前言&#xff1a; 一、易用性 二、灵活性 三、可靠性 四、成本 如何正确选择接口测试工具 测试用例 接口测试数据 自动化测试 测试报告 总结 前言&#xff1a; 接口测试是一种重要的测试类型&#xff0c;常用于Web应用程序和服务的测试。选择一个合适的接口测…

一分钟了解物联存储柜的特点和功能

物联存储柜是一种智能存储柜&#xff0c;具有多种传感器和通信技术&#xff0c;集成物联网和云计算技术&#xff0c;通过自动化、智能化、网络化将传统存储柜与智能设备相结合&#xff0c;自动识别、存取物品&#xff0c;通过网络进行数据交互&#xff0c;实现远程监测和管理功…

矿业变革进行中,北斗技术赋能智慧矿山

近年来&#xff0c;在国家政策支持和技术创新驱动下&#xff0c;国内矿山一直致力于向智能化、数字化方向发展&#xff0c;智慧矿山建设正在加速推进中。 我国自主研发的北斗导航系统&#xff0c;不断与千行百业融合&#xff0c;广泛应用于生产生活的各个领域。“北斗矿业”也成…

怎么自学网安?过程中遇到问题怎么解决

趁着今天下班&#xff0c;我花了几个小时整理了下&#xff0c;非常不易&#xff0c;希望大家可以点赞收藏支持一波&#xff0c;谢谢。 我的经历&#xff1a; 我 19 年毕业&#xff0c;大学专业是物联网工程&#xff0c;我相信很多人在象牙塔里都很迷茫&#xff0c;到了大三大…

JavaScript数学对象-数字进制转换

关注“大前端私房菜”微信公众号&#xff0c;输入暗号【面试宝典】即可免费领取107页前端面试题。 什么是进制 进制就是达到指定位置时候进一位 常见的进制 十进制: 0 1 2 3 4 5 6 7 8 9 10 11 12 ... 99 100 101 二进制: 0 1 10 11 100 101 110 111 1000 八进制: 0 1 2 3 4 …

在thinkBook16的win11基础上安装ubuntu22.04

简介 背景&#xff1a;联想ThinkBook16 pro 32G/512G&#xff0c;系统盘已安装Win11&#xff0c;加装一条M.2-2T固态&#xff0c;想在2T上分一个300GB的EXT4分区&#xff0c;然后把ubuntu22.04安装在该分区上&#xff0c;并实现Win11Linux多系统共存。 目标&#xff1a;实现多…

【C++】STL基本介绍

目录 1、什么是STL 2、STL六大组件 2.1容器 2.2算法 2.3迭代器 1、什么是STL 概念: STL (standard template libaray - 标准模板库)&#xff1a;是 C 标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 …