装饰者模式,是谁装饰了谁?

2022-03-16  本文已影响0人  程就人生

说到装饰者模式,你想到了什么?

是谁装饰了谁?

谁是被装饰者,谁是装饰者?

它们之间是如何建立装饰关系的?

图片

装饰者模式(decorator pattern)允许向一个现有的对象添加新的功能,同时又不影响现有代码,不会改变现有结构。它是一种结构型模式,是继承模式的一个替代模式。

业务使用场景:动态扩展、撤销一个类的功能,同时又不影响现有的类。

关键代码:装饰抽象类继承现有组件类并依赖现有组件类,装饰继承类重写父类方法,对现有组件类进行装饰。

下面看UML类图关系: 图片

代码实现步骤:1.形状接口,被装饰类;

/**
 * 1.形状接口
 * @author 程就人生
 * @Date
 */
public interface IShape {

  void draw();
}

2.形状接口实现类,圆形和矩形,还可以有更多;

/**
 * 2.形状的实现类,圆形
 * @author 程就人生
 * @Date
 */
public class Circle implements IShape {

  @Override
  public void draw() {
    System.out.println("draw shape: circle");
  }
}

/**
 * 2.形状的实现类,矩形
 * @author 程就人生
 * @Date
 */
public class Rectangle implements IShape{

  @Override
  public void draw() {
    System.out.println("draw shape: rectangle");
  }
}

3.关键代码来了,抽象装饰类实现了现有类形状接口;

/**
 * 3.抽象装饰类,实现了现有接口IShape
 * @author 程就人生
 * @Date
 */
public class AbstractDecorator implements IShape{
  
  // 被装饰者
    protected IShape decoratedShape;
  
    public AbstractDecorator(IShape decoratedShape) {
    this.decoratedShape = decoratedShape;
  }

  @Override
  public void draw(){
    decoratedShape.draw();
  }  

}

4.抽象装饰类的继承者(一个或多个),重写父类的方法;

/**
 * 4.装饰抽象类的实现者
 * @author 程就人生
 * @Date
 */
public class RedShapeDecorator extends AbstractDecorator{

  public RedShapeDecorator(IShape decoratedShape) {
    super(decoratedShape);
  }

  @Override
  public void draw(){
    decoratedShape.draw();
    System.out.println("fill color: red");
  }
}

5.测试代码;

public static void main(String[] argo){    
    //被装饰者
    IShape circle = new Circle();    
    //无装饰的输出
    System.out.println("无装饰者输出:");
    circle.draw();
    
    //装饰者
    AbstractDecorator redCircleDecorator = new RedShapeDecorator(circle);
    //被装饰过的输出
    System.out.println("被装饰过输出:");
    redCircleDecorator.draw();   
    
  }

测试结果:

无装饰者输出:
draw shape: circle
被装饰过输出:
draw shape: circle
fill color: red

这段代码的意思是:现有形状接口,和实现该接口的圆形、矩形,想要给形状填充颜色,还不想改变这几个类。于是,增加了抽象装饰类,和抽象装饰类的继承者---红色填充装饰类。使用装饰类来对形状进行颜色的填充,这样就达到了不改变现有代码又可以达到填充颜色的效果。

最后总结

装饰者模式也是经常用到的模式,一般源码的类名中含有decorator的,都是装饰者模式,或者装饰者模式和其他模式的组合。 看网上示例无数,不如自己动手码一遍来得印象深刻,还等什么,赶紧试一试吧!

上一篇下一篇

猜你喜欢

热点阅读