装饰者模式定义:装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方法。

装饰者模式是对原有功能增加新的功能(行为),当然,给一个类增加新功能(行为)我们可以使用继承或组合。但是单独的使用继承或组合实现将会产生大量的类,而使用装饰者模式可以在保持良好的扩展性同时避免产生大量的类。

优点:

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
  • 装饰器模式完全遵守开闭原则

缺点:过度使用会产生很多子类

装饰者模式结构:

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

装饰者模式实现:

场景说明构件为:LOL里面的英雄。装饰为LOL里面的装备。使用云顶之弈模式为为背景。

package com.wly.DesignPatterns;/*** @program: StudyDome* @author: yuanzhang* @create: 2020-12-02 15:29**/
public class Decorator {public static void main(String[] args) {System.out.println("获得一个英雄---泰隆");BaseRole shadowTalon = new ShadowTalon();System.out.println("-----------:"+shadowTalon.getEquipment());System.out.println("给他装个电刀");shadowTalon = new Electrotome(shadowTalon);System.out.println("-----------:"+shadowTalon.getEquipment());System.out.println("给它装个轻语");shadowTalon = new Whisper(shadowTalon);System.out.println("-----------:"+shadowTalon.getEquipment());}}
/*** @Annotation:抽象构件 -----角色* @Author: yuanzhang* @Date:  15:35*/
abstract class BaseRole{/**  获取装备*/protected abstract String getEquipment();
}
/*** @Annotation:具体构件----英雄泰隆* @Author: yuanzhang* @Date:  15:35*/
class ShadowTalon extends BaseRole{@Overrideprotected String getEquipment() {return "ShadowTalon";}
}
/*** @Annotation:抽象装饰----装备库* @Author: yuanzhang* @Date:  15:40*/
class EquipmentLibrary extends BaseRole{protected BaseRole role;EquipmentLibrary(BaseRole role){this.role = role;}@Overrideprotected String getEquipment() {return role.getEquipment()+"没装备";}
}
/*** @Annotation:具体装饰----电刀* @Author: yuanzhang* @Date:  15:47*/
class Electrotome extends EquipmentLibrary{Electrotome(BaseRole role) {super(role);}@Overrideprotected String getEquipment(){return role.getEquipment()+"|电刀";}
}
/*** @Annotation:具体装饰----最后的轻语* @Author: yuanzhang* @Date:  15:57*/
class Whisper extends EquipmentLibrary{Whisper(BaseRole role){super(role);}@Overrideprotected String getEquipment() {return role.getEquipment()+"|轻语";}
}

输出:

获得一个英雄---泰隆
-----------:ShadowTalon
给他装个电刀
-----------:ShadowTalon|电刀
给它装个轻语
-----------:ShadowTalon|电刀|轻语

软件设计模式之路-----装饰者模式相关推荐

  1. 软件设计模式之(二)装饰者模式

    转载自 :  http://blog.csdn.net/chenyujing1234 例子代码:(编译工具:Eclipse) http://www.rayfile.com/zh-cn/files/12 ...

  2. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  3. 设计模式之【装饰器模式】

    和表妹去喝奶茶 表妹:哥啊,我想喝奶茶. 我:走啊,去哪里喝? 表妹:走,我带你去,我经常去的那家,不但好喝,还可以自由搭配很多小料.我每次都是不同的搭配,换着喝,嘻嘻. 我:你倒是挺会喝的嘛~ 你看 ...

  4. 通俗易通,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了

    文章目录 什么是装饰者模式 装饰者模式中的角色 抽象构件(Component)角色 具体构件(Concrete Component)角色 装饰(Decorator)角色 具体装饰(Concrete D ...

  5. 设计模式 - 结构型 - 装饰者模式

    2019独角兽企业重金招聘Python工程师标准>>> 介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比继承更为灵活. 主要解决:一般的,我们为了扩展一 ...

  6. 设计模式学习3——装饰者模式(Decorator)

    没想到鼻炎还要做手术,这应该是出生到现在的第一个手术吧,据说是个小手术,呵呵,应该没有什么问题吧,不过得有10天左右的手术及休养时间,不知道设计模式的学习会不会被打断,嘿嘿. 装饰者模式        ...

  7. 设计模式篇——初探装饰器模式

    文章目录 1.装饰器模式介绍 2.装饰器模式类图 3.装饰器模式Demo实现(一个小镇的拉面馆) 4.装饰器模式总结 装饰器模式介绍:装饰器模式可以在不修改任何底层代码的情况下,给对象赋予新的职责(程 ...

  8. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  9. java中装饰器_Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  10. 《设计模式》之装饰器模式

    一.什么是装饰器模式 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能,也 ...

最新文章

  1. FCKeditor 2.6 安装配置使用指南(asp)
  2. google us web
  3. 如何在while和for中使用ssh
  4. 笨办法学 Python · 续 练习 24:URL 快速路由
  5. 硬件工程师的基本技能
  6. OpenShift 4 - 用CA证书或Token访问Internal Registry中的容器
  7. 达摩院研发自动驾驶高精定位系统,无GPS信号也可实现厘米级定位
  8. python PPT学习资料分享
  9. 基于marlin固件的SCARA机器人
  10. python重试组件tenacity介绍
  11. G1垃圾回收日志分析
  12. 周易六十四卦—水泽节卦
  13. 超简单禁止迅雷下载!(分析+方法)
  14. odoo13-14电商插件
  15. music功能 vue_vue_music:歌手详情页
  16. 品牌声量是什么?怎么查询统计品牌声量?
  17. 甲级测绘资质审批常见问题-甲级测绘资质如何办理?
  18. Android FrameWork 学习之Android 系统源码调试
  19. Python数据标准化
  20. 浪潮信息m5服务器,浪潮英信服务器NF8480M5

热门文章

  1. linux运维是做什么的
  2. 蓝牙软件测试指标,手机软件测试蓝牙.pdf
  3. 24第六季四小时首播进入倒计时!
  4. 2018阿里菜鸟无人仓一面面经
  5. C#未能加载文件或程序集
  6. 合肥工业大学计算机与信息学院导师介绍,合肥工业大学计算机与信息学院硕士生导师:方静副教授...
  7. Android植入Wooboo广告教程
  8. hdu 4826 Labyrinth【DP】
  9. XCTF-攻防世界CTF平台-Web类——19、mfw(.Git源代码泄露、php的assert断言)
  10. 64位Win7 服务器运行失败