装饰设计模式

来源:互联网 发布:博拉网络招聘 编辑:程序博客网 时间:2024/05/16 08:29
  1. 装饰模式:属于结构模式,动态地对一个对象进行功能上的扩展。

  2. 结构模式:用来处理类或对象的组合。
  3. -----------------------------------
  4. 装饰模式的构建方法:
  5. 1、抽象构件角色(Component):定义一个抽象接口,以规范准备接收附加责任的对象。
  6. 2、具体构件角色(Concrete Component):这是被装饰者,定义一个将要被装饰增加功能的类。
  7. 3、装饰角色(Decorator):持有一个构件对象的实例,并定义了抽象构件定义的接口。
  8. 4、具体装饰角色(Concrete Decorator):负责给构件添加增加的功能。
  9. -----------------------------------

  10. 通俗的说实现装饰模式的方法是:
  11. 1、装饰对象和真实对象有相同的接口;
  12. 也就是装饰角色和被装饰者有相同的抽象构件角色。
  13. 2、装饰对象包含一个真实对象的实例,并定义一个抽象构件的接口。
  14. 3、装饰对象接受所有来自客户端(具体装饰角色)的请求,并把这些请求转发给真实的对象。
  15. 4、装饰对象在转发这些请求以前或以后增加的一些附加功能时,不用修改真实对象的结构,就可以在外部增附加的功能(称为动态扩展)。
  16. 装饰模式结构模型:

  17. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  18. 装饰模式的好处:
  19. 1、动态扩展功能使程序代码更易维护,避免修改的麻烦,为对象添加新功能更加方便、灵活。
  20. 2、使用装饰模式可以随时应对某个对象的变化,可以尽量少的去修改原代码,只需通过增加类或配置就可以完成变更,最大程度的保全了对象的原有结构。
  21. -----------------------------------

  22. 适用装饰模式的场合:
  23. 1、装饰模式适用于:当我们需要为某个现有的对象,动态的增加一个新功能或职责。
  24. 2、装饰模式常适用于某个对象的职责经常发生变化或经常需要动态增加职责。如果使用继承来扩展这些变化的职责,这样的话,子类会爆炸式地增长,膨胀速度过快,难以控制。(装饰模式与继承的区别)

  25. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  26. 举例说明:


  27. //抽象构件
  28. public abstract class Person {
  29. public abstract void walk();//人这个类具有行走这个 抽象方法  
  30. }
  31. //真实类
  32. public class Man extends Person {

  33. @Override
  34. public void walk() {
  35. System.out.println(" Man人默认的行走方式是步行 ");
  36. }
  37. }
  38. //装饰类
  39. public abstract class DecoratorMan extends Person {

  40.     protected Person person;//定义一个抽象构件
  41.     public void setPerson(Person person) {
  42.         this.person = person;
  43.     }
  44.     @Override
  45.     public void walk() {
  46.         person.walk();
  47.     }
  48. }
  49. //具体装饰角色
  50. public class Superman extends DecoratorMan {

  51.     @Override
  52.     public void walk() {
  53.         super.walk();
  54.         System.out.println("超人加上能飞的行走方式");
  55.     }
  56. }

  57. //具体装饰角色
  58. public class Spiderman extends DecoratorMan {
  59.     @Override
  60.     public void walk() {
  61.         super.walk();
  62.         System.out.println("蜘蛛侠加上能跳的行走方式");
  63.     }
  64. }
  65. //测试类

  66. public class Test {

  67.     public static void main(String[] args) {

  68.         Man man = new Man();//创建一个Man实例对象
  69.         Superman superman = new Superman();
  70.         superman.setPerson(man);

  71.         Spiderman sipdeman = new Spiderman();
  72.         sipdeman.setPerson(superman);

  73.         sipdeman.walk();
  74.     }
  75. }
  76. 输出结果:

  77. Man人默认的行走方式是步行 
  78. 超人加上能飞的行走方式
  79. 蜘蛛侠加上能跳的行走方式
复制代码