美文网首页
装饰者模式,是谁装饰了谁?

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

作者: 程就人生 | 来源:发表于2022-03-16 07:41 被阅读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的,都是装饰者模式,或者装饰者模式和其他模式的组合。 看网上示例无数,不如自己动手码一遍来得印象深刻,还等什么,赶紧试一试吧!

    相关文章

      网友评论

          本文标题:装饰者模式,是谁装饰了谁?

          本文链接:https://www.haomeiwen.com/subject/tpgudrtx.html