一、概述

装饰模式可以在不改变一个对象本身功能的基础上增强或增加某些功能,举个例子,就相当于武侠小说里的内功,同样都是降龙十八掌,因为降龙十八掌属于外功,所以可能学了九阳真经的人和没有学九阳真经的人使用起来的威力必然是不相同的。
就好像倚天屠龙记里,阳顶天的乾坤大挪移必然没有张无忌的厉害。

正经一点的解释是这样子的:

装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。

装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能。
这也应证了设计模式七大原则中的“合成复用原则”

二、角色职责与UML图

2.1角色与职责

Component(抽象构件)

  • 它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作。

ConcreteComponent(具体构件)

  • 它是抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)。

Decorator(抽象装饰类)

  • 它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。

ConcreteDecorator(具体装饰类)

  • 它是抽象装饰类的子类,负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用以扩充对象的行为。

2.2 UML图

三、示例

就以武功为例,进行演示。

创建一个功夫类作为抽象构件,其中定义需要增强的方法

/*** 抽象构件:定义行为* @author ZhongJing </p>*/
public abstract class GongFu {public abstract int attack();}

创建具体构件,降龙十八掌,拥有具体的行为

/*** 具体构件:拥有自己的行为* @author ZhongJing </p>*/
public class XiangLongShiBaZhang extends GongFu{@Overridepublic int attack() {return 20;}}

创建抽象装饰器,内功,其中维护一个抽象构件,利用动态绑定就可以增强所有的继承自抽象构件的具体构件类中指定要增强的方法

/*** 抽象装饰类:继承了抽象构件,并且内部维护一个抽象构件的对象* @author ZhongJing </p>*/
public class NeiGongDecorator extends GongFu {private GongFu gongFu;public NeiGongDecorator(GongFu gongFu) {this.gongFu = gongFu;}public GongFu getGongFu() {return gongFu;}public void setGongFu(GongFu gongFu) {this.gongFu = gongFu;}@Overridepublic int attack() {return gongFu.attack();}
}

创建具体装饰器北冥神功,对某个具体构件的功能进行增强

/*** 具体装饰类:负责增强构件的功能或给构件增加新的功能。* @author ZhongJing </p>*/
public class BeiMingDecorator extends NeiGongDecorator{public BeiMingDecorator(GongFu gongFu) {super(gongFu);}@Overridepublic int attack() {// 具体构件原本的行为int attack = super.attack();// 具体装饰类增强了具体构件的行为attack *= 100;System.out.println("学习北冥神功,战斗力✖️100");return attack;}
}

创建一个测试类来测试一下我们的代码:

/*** @author ZhongJing </p>*/
public class MainTest {public static void main(String[] args) {XiangLongShiBaZhang xiangLongShiBaZhang = new XiangLongShiBaZhang();System.out.println("降龙十八掌的伤害:" + xiangLongShiBaZhang.attack());BeiMingDecorator beiMingDecorator = new BeiMingDecorator(xiangLongShiBaZhang);System.out.println("学习北冥神功后降龙十八掌的伤害:" + beiMingDecorator.attack());}}

运行结果如下:

降龙十八掌的伤害:20
学习北冥神功,战斗力✖️100
学习北冥神功后降龙十八掌的伤害:2000

Java设计模式——装饰器模式相关推荐

  1. Java设计模式-装饰器模式 理论代码相结合

    继Java设计模式适配器模式后的装饰器模式来啦,让我们一起看看吧. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一 ...

  2. java设计模式----装饰器模式

    Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样.因此,装饰器模式具有如下的特征: 它必须具有一个装饰的对象. 它必须拥有与被装饰对象相同的接口. ...

  3. Java设计模式----------装饰器模式

    1.介绍 装饰器模式是一种结构型的设计模式.使用该模式的目的是为了较为灵活的对类进行扩展,而且不影响原来类的结构.有同学说可以通过继承的方式进行实现啊,没错,继承的确可以实现,但是继承的成本相对比较高 ...

  4. JAVA设计模式-装饰器模式(Decorator)

    装饰器模式(Decorator) 为了某个实现类在不修改原始类的基础上进行动态地覆盖或者增加方法 采用--------装饰器模式 实现类要保持与原有类的层级关系 装饰器模式是一种特殊的适配器模式 拿适 ...

  5. java设计模式--装饰器模式

    转载 http://sishuok.com/forum/blogPost/list/5766.html 22.1 场景问题 22.1.1 复杂的奖金计算 考虑这样一个实际应用:就是如何实现灵活的奖金计 ...

  6. java设计模式---装饰器模式

    装饰者模式 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 具体被装饰者和抽象装饰类都继承于抽象被装饰者类,继承的是类型,而不是行为.行为来自装饰者和基础组件,或与其他 ...

  7. Java —— Decorator 装饰器模式

    文章目录 Java -- Decorator 装饰器模式 简介 用处 简单例子 结构 代码 涉及角色 相关的设计模式 应用实例 优点 缺点 使用场景 注意事项 代码 Java -- Decorator ...

  8. Go 设计模式 - 装饰器模式

    装饰模式使用对象组合的方式动态改变或增加对象行为.Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式.使用匿名组合,在装饰器中不必显式定义转调原对象方法. 设计模式 装饰器模式 装饰器模式主要 ...

  9. Java设计模式 -10- 装饰器模式(Decorator模式)

    Java设计模式 -10- 装饰器模式(Decorator模式) 前言 装饰器模式的定义与特点 优点: 缺点: 装饰器模式的结构与实现 1. 模式的结构 2. 模式的实现 装饰器模式的应用实例 装饰器 ...

  10. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

最新文章

  1. excel表中判断A列与B列内容是否相同,相同的话在C列按条件输出!
  2. LibSVM学习(六)——easy.py和grid.py的使用(转)
  3. 树莓派 rfid_树莓派工控机做Modbus RTU主站读取RFID数据
  4. CodeForces - 1331E Jordan Smiley(图形转换)
  5. java atomiclong 使用_Java并发AtomicLongArray类
  6. CodeForces-999D Equalize the Remainders (贪心+神奇的STL)
  7. windows mysql5.7 忘记密码_Windows下Mysql5.7忘记root密码的解决方法
  8. Java 基础总结--反射的基本操作
  9. McAfee麦咖啡8.5企业版高级教程
  10. 【爆漏】酷我音乐盒再曝缺陷
  11. windows驱动开发2:驱动开发调试环境配置(WDK)
  12. Java多线程之定时任务 以及 SpringBoot多线程实现定时任务以及分享动态实现定时任务
  13. Android笔记:使用Glide加载图片刷新时会闪烁
  14. 面试常见的 10 大问题
  15. 区块链系统开发-区块链交易系统开发-核心技术
  16. 点击跳出商务通对话框
  17. ARM平台处理器简介-ARMv7
  18. cmd中连接雷电模拟器时报错adb device not found
  19. java窗体中添加图片_在java窗体程序中添加图片的方法
  20. java实现数据同步

热门文章

  1. 【SQL Server】入门教程-基础篇(二)
  2. 程序猿应该拥有的浏览器
  3. 非参数检验统计量分析
  4. vs 2017 配置 boost 库
  5. 红帽linux6.8镜像下载,redhat8镜像下载
  6. Mac IDEA切换主题颜色
  7. linux中nmap命令,Linux中nmap命令起什么作用呢?
  8. seay代码审计mysql插件报错_Seay源代码审计系统v2.0源码
  9. 《Kafka权威指南》读书笔记1 初始Kafka
  10. 2019年PMP考试模拟题(附答案解析)