当前位置:   article > 正文

常用设计模式——装饰者模式_装饰者设计模式

装饰者设计模式

前言

上班族大多都有睡懒觉的习惯,每天早上上班时间都很紧张,于是很多人为了多睡一会,就会用方便的方式解决早餐问题。有些人早餐可能会吃煎饼,煎饼中可以加鸡蛋,也可以加香肠,但是不管怎么“加码”,都还是一个煎饼。在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等,都是装饰器模式


一、装饰者模式的定义与特点

1.1 装饰者模式的定义

装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用

  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果

  • 装饰器模式完全遵守开闭原则

1.2 装饰者模式的特点

其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。


二、装饰者模式的结构与实现

通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。下面来分析其基本结构和实现方法。

2.1 装饰者模式的结构

装饰器模式主要包含以下角色:

1.抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。

2.具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。

3.抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。

4.具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

装饰器模式的结构图如图所示:

2.2 装饰者模式的实现

  1. public class DecoratorPattern {
  2. public static void main(String[] args) {
  3. Component p = new ConcreteComponent();
  4. p.operation();
  5. System.out.println("---------------------------------");
  6. Component d = new ConcreteDecorator(p);
  7. d.operation();
  8. }
  9. }
  10. //抽象构件角色
  11. interface Component {
  12. public void operation();
  13. }
  14. //具体构件角色
  15. class ConcreteComponent implements Component {
  16. public ConcreteComponent() {
  17. System.out.println("创建具体构件角色");
  18. }
  19. public void operation() {
  20. System.out.println("调用具体构件角色的方法operation()");
  21. }
  22. }
  23. //抽象装饰角色
  24. class Decorator implements Component {
  25. private Component component;
  26. public Decorator(Component component) {
  27. this.component = component;
  28. }
  29. public void operation() {
  30. component.operation();
  31. }
  32. }
  33. //具体装饰角色
  34. class ConcreteDecorator extends Decorator {
  35. public ConcreteDecorator(Component component) {
  36. super(component);
  37. }
  38. public void operation() {
  39. super.operation();
  40. addedFunction();
  41. }
  42. public void addedFunction() {
  43. System.out.println("为具体构件角色增加额外的功能addedFunction()");
  44. }
  45. }

程序运行结果如下:

创建具体构件角色
调用具体构件角色的方法operation()
---------------------------------
调用具体构件角色的方法operation()
为具体构件角色增加额外的功能addedFunction()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/551998
推荐阅读
相关标签
  

闽ICP备14008679号