设计模式之装饰者模式

设计模式之装饰者模式

装饰者模式: 动态地给一个对象装饰些额外的功能.


文章目录


一、装饰者模式是什么?

装饰者模式是动态地给一个对象装饰些额外的功能,若要扩展功能,装饰者提供了比继承更有弹性的替代方案,比生成子类更加灵活。

通常在继承关系中,为了扩展功能需要新增子类进行扩展,而装饰者模式,可以在不扩展子类的情况下,将对象的功能进行动态的扩展。

装饰者模式类图如下:
设计模式之装饰者模式
抽象构件(Component): 给出一个抽象接口,以规范接收附加功能的对象。
具体构件(ConcreteComponent): 定义一个将要接收附加功能的类。
装饰者(Decorat): 持有一个构件对象的实例,并定义一个与构件接口一致的接口。
具体装饰者(ConcretDecorat1,ConcretDecorat2): 负责给构件对象添加附加的功能。
测试类(DecoratTest): 测试装饰是否成功。

二、具体代码

1.Component类

代码如下(示例):

/**
 * 抽象构件
 */
public abstract class Component {
  public abstract void operate();
}

2.ConcreteComponent类

代码如下(示例):

/**
 * 具体构件
 */
public class ConcreteComponent extends Component {
  @Override
  public void operate() {
    System.out.println("具体构件");
  }
}

3.Decorat类

代码如下(示例) :

/**
 * 装饰者
 */
public abstract class Decorat extends Component {
  private Component component;

  public Decorat(Component component){
    this.component = component;
  }

  @Override
  public void operate() {
    component.operate();
  }
}

4.ConcretDecorat类

代码如下(示例) :

/**
 * 具体装饰者1
 */
public class ConcreteDecorat1 extends Decorat {

  public ConcreteDecorat1(Component component) {
    super(component);
  }
  private void method1(){
    System.out.println("装饰方法1");
  }

  @Override
  public void operate() {
    method1();
    super.operate();
  }
}
/**
 * 具体装饰者2
 */
public class ConcreteDecorat2 extends Decorat {

  public ConcreteDecorat2(Component component) {
    super(component);
  }
  private void method1(){
    System.out.println("装饰方法2");
  }

  @Override
  public void operate() {
    method1();
    super.operate();
  }
}

5.DecoratTest类

代码如下(示例) :

/**
 * @author haowu
 * @create 2021-09-25-21:41
 * @Description 测试类
 */
public class DecoratTest {
    @Test
    public void testDecorat() {
        Component concreteComponent = new ConcreteComponent();
        concreteComponent = new ConcreteDecorat1(concreteComponent);
        concreteComponent = new ConcreteDecorat2(concreteComponent);
        concreteComponent.operate();
    }
}

运行结果

设计模式之装饰者模式


总结

通过测试类,我们可以看到,客户端可以随意进行功能的添加,由客户端进行动态的执行放入的顺序,每个人放入的顺序不同,通过装饰者模式可以进行不同的组装来完成需求的变更。

装饰模式允许系统动态决定增加一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。通过使用不同的具体装饰类以及这些装饰类的排列组合,就可以创造出很多不同行为的组合。

注: 文字解释部分参考于https://zhuanlan.zhihu.com/p/65113766

上一篇:POJ 1423 斯特林


下一篇:安卓程序代写 网上程序代写[原]Android中的回调Callback