-------装饰模式

装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

-------1.介绍

意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

如何解决:将具体功能职责划分,同时继承装饰者模式。

关键代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。

应用实例: 1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

注意事项:可代替继承。

-------2.实例

2.1把一个形状装饰上不同的颜色,同时又不改变形状类

2.1.1.我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。

2.1.2.RedShapeDecorator 是实现了 ShapeDecorator 的实体类。

2.1.3.test,我们的演示类使用 RedShapeDecorator 来装饰 Shape 对象。

1 packagedecorate;2

3 /**

4 *@authorAdministrator5 * 形状接口6 */

7 public interfaceShape {8 voiddraw();9 }10

11

12

13 packagedecorate;14

15 /**

16 *@authorAdministrator17 *长方形18 */

19 public class Rectangle implementsShape {20

21 @Override22 public voiddraw() {23 //TODO Auto-generated method stub

24 System.out.println("形状:长方形");25 }26

27

28 }29

30

31

32

33

34 packagedecorate;35

36 /**

37 *@authorAdministrator38 *圆形39 */

40 public class Circle implementsShape {41

42 @Override43 public voiddraw() {44 //TODO Auto-generated method stub

45 System.out.println("形状:圆形");46 }47

48

49 }50

51

52

53

54 packagedecorate;55

56 /**

57 *@authorAdministrator58 * 装饰对象59 */

60 public abstract class ShapeDecorator implements Shape {//装饰器

61 protectedShape decoratedShape;62 @Override63 public voiddraw() {64 //TODO Auto-generated method stub

65 decoratedShape.draw();66 }67 publicShapeDecorator(Shape decoratedShape) {68 this.decoratedShape =decoratedShape;69 }70

71

72 }

1 packagedecorate;2

3 /**

4 *@authorAdministrator5 * 颜色 红色6 */

7 public class RedShapeDecorator extendsShapeDecorator {8

9 publicRedShapeDecorator(Shape decoratedShape) {10 super(decoratedShape);11 //TODO Auto-generated constructor stub

12 }13

14 @Override15 public voiddraw() {16 //TODO Auto-generated method stub

17 decoratedShape.draw();18 setRedBorder(decoratedShape);19 }20

21 public voidsetRedBorder(Shape decoratedShape){22 System.out.println("颜色: Red");23 }24

25 }

1 packagedecorate;2

3 public classTest {4 public static voidmain(String[] args) {5 Shape shape=newCircle();6 Shape redCircle=new RedShapeDecorator(newCircle());7 shape.draw();8 System.out.println();9 redCircle.draw();10 }11 }

输出结果:

形状:圆形

形状:圆形

颜色: Red

2.2.装饰模式为已有类动态附加额外的功能就像LOL英雄升级一样。每次英雄升级都会附加一个额外技能点学习技能。

1 packagelol;2

3 /**

4 *@authorGH5 * 英雄接口6 */

7 public interfaceHero {8 voidstudy();9 }10

11

12

13 packagelol;14

15 /**

16 *@authorGH17 * 具体的英雄 蛮王18 */

19 public class BarbarianKing implementsHero {20 privateString name;21 @Override22 public voidstudy() {23 //TODO Auto-generated method stub

24 System.out.println("英雄:"+name);25 }26 publicBarbarianKing(String name) {27 super();28 this.name =name;29 }30

31 }32

33

34

35 packagelol;36

37 /**

38 *@authorAdministrator39 * 技能装饰器40 */

41 public abstract class Skills implementsHero{42 protectedHero heroSkill;43

44 publicSkills(Hero heroSkill) {45 this.heroSkill =heroSkill;46 }47 @Override48 public voidstudy() {49 //TODO Auto-generated method stub

50 heroSkill.study();51 }52 }53

54

55

56 packagelol;57

58 /**

59 *@authorAdministrator60 *具体技能Q61 */

62 public class KillQ extendsSkills {63

64 publicKillQ(Hero heroSkill) {65 super(heroSkill);66 //TODO Auto-generated constructor stub

67 }68

69 @Override70 public voidstudy() {71 //TODO Auto-generated method stub

72 heroSkill.study();73 setkill(heroSkill);74 }75 public voidsetkill(Hero hero){76 System.out.println("习得技能:Q");77 }78

79 }80

81

82

83 packagelol;84

85 /**

86 *@authorAdministrator87 *具体技能W88 */

89 public class KillW extendsSkills {90

91 publicKillW(Hero heroSkill) {92 super(heroSkill);93 //TODO Auto-generated constructor stub

94 }95

96 @Override97 public voidstudy() {98 //TODO Auto-generated method stub

99 heroSkill.study();100 setkill(heroSkill);101 }102 public voidsetkill(Hero hero){103 System.out.println("习得技能:W");104 }105

106 }107

108

109 packagelol;110

111 public classTest {112

113 public static voidmain(String[] args) {114 //TODO Auto-generated method stub

115 Hero hero=new BarbarianKing("蛮王");116 hero.study();117 System.out.println();118 KillQ q=newKillQ(hero);119 q.study();120

121 System.out.println();122 KillQ q2=newKillQ(q);123 q2.study();124

125 System.out.println();126 KillW w=newKillW(q2);127 w.study();128 }129

130 }

输出结果:

英雄:蛮王

英雄:蛮王

习得技能:Q

英雄:蛮王

习得技能:Q

习得技能:Q

英雄:蛮王

习得技能:Q

习得技能:Q

习得技能:W

-------3.总结:

装饰模式是为已有功能动态的添加更多功能的一种方式。当系统需要新功能的时候,通过新加代码来装饰原有类的核心职责,而这些新加的东西仅仅是为了满足一些只在特殊情况下才会执行的特殊行为。装饰模式的有点其实就是:把类中装饰功能从类中搬除出去,在简化原有类的基础上有效的把类的核心职责和装饰功能区分开来。

java中装潢模式_JAVA中的设计模式四(装饰模式)相关推荐

  1. java 职责链模式_Java中的责任链模式

    java 职责链模式 当应有几个处理器来执行某项操作并为这些处理器定义特定顺序时,就需要采用责任链设计模式. 在运行时处理器顺序的可变性也很重要.模式的UML表示如下: 处理程序定义处理器对象的一般结 ...

  2. java 工厂方法模式_Java中的工厂方法模式

    java 工厂方法模式 在上一篇有关模板方法模式的文章中 ,我展示了如何利用lambda表达式和默认方法 . 在本文中,我将探讨工厂方法模式,并了解如何利用方法引用,这是Java 8中与lambda表 ...

  3. java责任链模式_java中责任链模式详解和使用方法

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为 ...

  4. java 管理员命令模式_java中命令模式详解和使用方法

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该 ...

  5. java socket 阻塞模式_Java中Socket Read阻塞问题

    本人来说并不熟悉JAVA语言,只是近期在分析某个简单的java agent程序时,根据对应的代码写了一个对接的程序,两者之间是典型的C/S socket编程.客户端在向服务端发送相应的指令后,服务端( ...

  6. java 中策略模式_JAVA中的策略模式

    现在我们有一个虚基类-鸭子(abstract Duck). 有真鸭子,野鸭子,橡皮鸭子继承了该类.虚基类有swing方法,毕竟游泳是所有的鸭子都应有的功能.还有一个虚方法display,这个方法在子类 ...

  7. java设计模式代理模式_Java中的代理设计模式

    java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...

  8. java设计模式之状态模式_Java中的状态设计模式

    java设计模式之状态模式 在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式. 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用. 当对象的行为取决于其当前状态时,我们 ...

  9. java设计模式 订阅模式_Java中的复合设计模式

    java设计模式 订阅模式 当我们必须使用对象的树状分层结构时,复合设计模式非常有用. 它使我们能够统一对待单个对象和对象组成. 它属于结构设计模式的范畴,因为它将对象组合成树形结构以表示部分整个层次 ...

最新文章

  1. powershell获取linux文件,powershell如何读取文件名并赋值到变量?
  2. 【OpenCV3】透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解
  3. ​北京大学吴华君课题组高新诚聘 医学生信 助理研究员和博士后
  4. angular4点击事件监听_JavaScript从零开始——DOM事件编程(1)
  5. 最大规模传统零售升级揭晓 100家大润发线上线下同步加入天猫618
  6. jq的each方法之退出循环与继续循环
  7. 50个开源性能测试工具
  8. Java源码阅读神器之Translation翻译插件
  9. 京东html,京东HTML静态模板页面全套
  10. 网络安全防护体系建设
  11. PS CC2019新手必学基础(首选项)设置
  12. 文件同步工具GoodSync简介
  13. 玩觅伊的女孩,都是一些什么样的人?
  14. jsGannt Improved在vue中的使用
  15. Ruoyi若依前后端分离框架【若依登录详细过程】
  16. 校招进大厂的Tips
  17. mysql 别名_MySQL 字段别名(列别名)
  18. 0328 - 一日三更
  19. 可截断素数(Truncatable primes)
  20. Qt的.pro文件简介

热门文章

  1. c语言fscanf遇到逗号,C中的fscanf - 如何确定逗号?
  2. What is Spring Boot? Autoconfigurations In-Depth
  3. Git 导出 stash 备份为 patch 文件
  4. Unicode汉字编码范围\u4E00-\u9FA5
  5. 2021-2027全球与中国磷酸铁锂电池(LFP)市场现状及未来发展趋势
  6. 小宝宝乖乖(半岁了:)
  7. 电玩商家团购转化千单,小魔推应该怎么做
  8. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java宠物寄养管理系统41n70
  9. c语言2字节16进制转10进制,C语言中十六进制转十进制两种实现方法
  10. 女生计算机软件还是硬件,对于女生来说,计算机专业选软件好呢,还是硬件?...