装饰者模式

1、定义及作用

定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。
   设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。

2、涉及角色

抽象构件角色:定义一个抽象接口,来规范准备附加功能的类。

具体构件角色:将要被附加功能的类,实现抽象构件角色接口。

抽象装饰者角色:持有对具体构件角色的引用并定义与抽象构件角色一致的接口。

具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外功能

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

package decorator;
public interface Work {
  public void paint();
}

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

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("妈妈给画上好了颜色。");
  }
}

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("爸爸给画装好了一个画框。");
  }
}

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


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

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

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

你可能感兴趣的:(装饰者模式)