关注“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等等。
下一章,江帅将带大家学习经纪人的工作(设计模式之代理模式)