装饰者模式(不太理解的设计模式)

对于装饰者模式一直不太理解,不懂的他与桥接模式的区别在哪????

23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰模式的特点编辑

(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

装饰者与适配者模式的区别编辑

1.关于新职责:适配器也可以在转换时增加新的职责,但主要目的不在此。装饰者模式主要是给被装饰者增加新职责的。
2.关于原接口:适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完成使用。(增加新接口的装饰者模式可以认为是其变种--“半透明”装饰者)
3.关于其包裹的对象:适配器是知道被适配者的详细情况的(就是那个类或那个接口)。装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道。

1、 Work.java     接口
  2、 Son.java      被装饰者-负责画画
  3、 Mother.java   装饰者-负责上颜色
  4、 Father.java   装饰者-负责装画框
  5、 DecoratorTest.java 带有main方法的测试类,

        模拟3种调用情况:A,只画画;

                         B,画画,上色;

                         C, 画画,上色,装框

===============   1、 Work.java
package decorator;

public interface Work {
  public void paint();
}
===============   1   end

===============   2、 Son.java
package decorator;

public class Son implements Work {
  public void paint() {
    System.out.println("儿子用铅笔画好了一幅画。");
  }
}
===============   2   end

===============   3、 Mother.java
package decorator;

public class Mother implements Work {

  //被装饰者
  private Work work;
 
  public Mother(Work work) {
    this.work = work;
  }
 
  private Mother() {}

  public void paint() {
   
    //妈妈装饰者做的职责
    System.out.println("妈妈正在做给画上颜色前的准备工作。");
   
    //被装饰者做的职责
    work.paint();
   
    //妈妈装饰者做的职责
    System.out.println("妈妈给画上好了颜色。");
  }

}
===============   3   end

===============   4、 Father.java
package decorator;

public class Father implements Work {

  //被装饰者
  private Work work;
 
  public Father(Work work) {
    this.work = work;
  }
 
  private Father() {}

  public void paint() {
   
    //爸爸装饰者做的职责
    System.out.println("爸爸正在做上画框前的准备工作。");
   
    //被装饰者做的职责
    work.paint();
   
    //爸爸装饰者做的职责
    System.out.println("爸爸给画装好了一个画框。");
  }

}
===============   4   end

===============   5、 DecoratorTest.java
package decorator;

public class DecoratorTest {

  public static void main(String[] args) {
   
    //只画铅笔画
    Work work = new Son();
    work.paint();   
    System.out.println(" ");
   
    //除了画铅笔画,还要给画上颜色
    work = new Mother(work);
    work.paint();
    System.out.println(" ");
   
    //除了画铅笔画,给画上颜色,还要给画上画框
    work = new Father(work);
    work.paint();
   
  }
}
===============   5   end

输出:
儿子用铅笔画好了一幅画。


妈妈正在做给画上颜色前的准备工作。
儿子用铅笔画好了一幅画。
妈妈给画上好了颜色。


爸爸正在做上画框前的准备工作。
妈妈正在做给画上颜色前的准备工作。
儿子用铅笔画好了一幅画。
妈妈给画上好了颜色。
爸爸给画装好了一个画框。

原文地址:https://www.cnblogs.com/qiaozhoulin/p/4784033.html