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

news/2024/11/29 11:43:58/

关注“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{//拯救世界的行为@Overridepublic 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;}@Overridepublic void behavior() {//执行目标对象原本的行为human.behavior();}
}/** @author:江帅*      具体装饰者类*          钢铁侠类*/
class IronMan extends Superhero {public IronMan(Human human) {super(human);}//增强目标对象的行为@Overridepublic 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.ppmy.cn/news/382839.html

相关文章

Android:OKHttp

特点 支持HTTP2/SPDYSocket自动选择最好路线,并支持自动重连拥有自动维护的Socket连接池,减少握手次数拥有队列线程池,轻松写并发拥有Interceptors轻松处理请求与响应(比如透明GZIP压缩)实现基于Headers的缓存策略 基…

springmvc应对vue跨域解决

方法很简单 这里使用的是spring4以上<mvc:cors><mvc:mapping path"/**" allowed-origins"*" allow-credentials"true" max-age"1800" allowed-methods"GET,POST,OPTIONS"/> </mvc:cors> 解决方案转自 海畅…

支持右翼教科书的日本企业与个人全部名单

企业&#xff1a; 朝日啤酒、三菱重工、日野汽车、五十铃汽车、住友生命、味之素、东京三菱银行、清水建设、中外制药、大成建设。 个人&#xff1a; 企业前会长、顾问、社长 粕谷哲夫 商业咨询顾问小野泽知之 光企画顾问河野正三 高龄者住宅财团理事长小林乔 富国生命保险…

感谢你们投票给了鸡腿

我们的鸡腿有肉 非常感谢“”海畅智慧“”软件的朋友&#xff0c;想想吧八千人的喜爱&#xff0c;我敢肯定原因就是下面我要说的。 你想要不只是整理硬盘视频 本周我们收到一封来自 陈萍 用户的电子邮件&#xff0c;内容如下&#xff1a; 我对你们的软件失望至极&#xff0c…

腿粗适合穿什么样裤型牛仔裤?

走在街上&#xff0c;看看周边的女孩&#xff0c;有一多半的人都穿着牛仔裤。但不是每种款式的牛仔裤都适合每种体型的人穿。那你知道腿粗的人适合穿什么样裤型的牛仔裤吗&#xff1f;如果你的腿粗&#xff0c;又不清楚什么样裤型的牛仔裤适合你穿着&#xff0c;就来这里看看吧…

有趣的数学,给你的机器学习增加点信心

相似的判断 下面两个句子相同吗&#xff1f;怎么判断&#xff1f;思路呢&#xff1f; 句子A&#xff1a;这只皮靴号码大了。那只号码合适 句子B&#xff1a;这只皮靴号码不小&#xff0c;那只更合适 1&#xff09;分词 句子A&#xff1a;这只/皮靴/号码/大了。那只/号码/合…

C#用正则表达式 获取标签的属性或值

整理两个 在C#中,用正则表达式 获取网页源代码标签的属性或值的方法 : 1、获取标签中的值: string str="<a href=\"www.csdn.net\" class=\"main\" >CSDN</a>" 结果:CSDN 调用例子:string name=GetTitleContent(str,"a&q…

入行机器学习算法,其实就是顺应时代发展

90年代初为什么没有“蹦极” 从高处一跃而下的happy&#xff0c;这事情不可能发生在90年代的娱乐花费中&#xff0c;除了自己是在想不开。为什么&#xff1f;因为不顺应时代发展需要&#xff0c;有很多地方温饱都还没有解决。那个年代什么顺应时代了呢&#xff0c;海尔冰箱、美…