当前位置: 首页 > 后端技术 > Java

设计模式Decorator模式

时间:2023-04-01 22:42:06 Java

本文已收录在Github仓库,包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式等核心知识架构、校招和社招分享等点,欢迎star~Github地址:https://github.com/Tyson0314/...装饰者模式(decoratorpattern):动态的给对象附加职责,如果要扩展功能,装饰器提供了一种更灵活的继承替代方案。装饰模式以对客户端透明的方式扩展了对象的功能,客户端感觉不到对象在装饰前后有什么不同。装饰器模式可以在不创建更多子类的情况下扩展对象的功能。比如设置FileInputStream,先用BufferedInputStream装饰一下,再用自己写的LowerCaseInputStreamfilter装饰一下。InputStreamin=newLowerCaseInputStream(newBufferedInputStream(newFileInputStream("test.txt")));装饰模式中的角色有:抽象组件(Component)角色:给出一个抽象的接口来规范准备接受额外职责的对象。ConcreteComponent角色:定义一个将接收额外职责的类。抽象装饰器(Decorator)作用:持有一个组件(Component)对象的实例,并定义一个与抽象组件接口一致的接口。具体装饰(ConcreteDecorator)作用:负责将附加职责“粘贴”到组件对象上。代码示例在LOL、王者荣耀等Dota类游戏中,英雄每次升级都会额外增加一个技能点,用于学习技能。这类似于为现有类动态添加额外功能的装饰模式。具体英雄是ConcreteComponent,技能栏是Decorator,每个技能都是ConcreteDecorator。新建接口:publicinterfaceHero{//学习技能voidlearnSkills();}创建接口的实现类(具体英雄盲僧)://ConcreteComponent具体英雄盲僧publicclassBlindMonkimplementsHero{privateStringname;publicBlindMonk(Stringname){this.name=name;}@OverridepublicvoidlearnSkills(){System.out.println(name+"学会了以上技能!");}}装饰角色://装饰技能栏publicabstractclassSkillsimplementsHero{//持有一个英雄对象接口privateHerohero;公共技能(英雄英雄){this.hero=hero;}@OverridepublicvoidlearnSkills(){if(hero!=null)hero.learnSkills();}}具体装饰作用://ConreteDecoratorskills:QpublicclassSkill_QextendsSkills{privateStringskillName;publicSkill_Q(Herohero,StringskillName){super(hero);this.skillName=skillName;}@OverridepublicvoidlearnSkills(){System.out.println("学习技能Q:"+skillName);超级学习技能();}}//ConreteDecorator能力:WpublicclassSkill_WextendsSkills{privateStringskillName;publicSkill_W(Herohero,StringskillName){super(hero);this.skillName=skillName;}@OverridepublicvoidlearnSkills(){System.out.println("学习了技能W:"+skillName);super.learnSkills();}}//ConreteDecorator能力:EpublicclassSkill_EextendsSkills{privateStringskillName;publicSkill_E(Herohero,StringskillName){super(hero);this.skillName=skillName;}@OverridepublicvoidlearnSkills(){System.out.println("学习了技能E:"+skillName);super.learnSkills();}}//ConreteDecorator能力:RpublicclassSkill_RextendsSkills{privateStringskillName;publicSkill_R(Herohero,StringskillName){super(hero);this.skillName=skillName;}@OverridepublicvoidlearnSkills(){系统。out.println("学习技能R:"+skillName);super.learnSkills();}}Client://Client:SummonerpublicclassPlayer{publicstaticvoidmain(String[]args){//选择英雄Herohero=newBlindMonk("李青");技能skills=newSkills(hero);Skillsr=newSkill_R(skills,"猛龙摇尾巴");技能e=newSkill_E(r,"天雷"断筋断骨");技能w=newSkill_W(e,"金钟罩/铁布衫");技能q=newSkill_Q(w,"天音"Wave/EchoStrike");//LearnSkillq.learnSkills();}}输出:学习技能Q:天空音波/回音打击,学习技能W:金钟罩/铁布衫,学习技能E:天雷破/断筋断骨,习得技能R:猛龙摆尾李青学会了以上技能!最后给大家分享一个Github仓库,里面有大斌整理的300多本经典计算机书籍PDF,包括C语言,C++,Java,Python,前端,数据库,操作系统,计算机网络,数据结构与算法,机器学习,编程生活等等,都可以star一下,下次找书的时候可以直接在上面搜索,仓库还在不断更新中~Github地址:https://github.com/Tyson0314/...