前言

博主github

博主个人博客http://blog.healerjean.com

1、Decorator装饰器模式

1.1、解释

假如现在有一块蛋糕

1、如果只涂上奶油,其他什么都不加,就是奶油蛋糕。

2、如果加上草莓,就是草莓奶油蛋糕。

3、如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛,就变成了一块生日蛋糕。

像这样不断地为对象添加装饰的设计模式被称为Decorator模式 ,Decorator 指的是装饰。

1.1.1、适配器和装饰器的区别

装饰器与适配器都有一个别名叫做 包装模式(Wrapper),它们看似都是起到包装一个类或对象的作用,但是使用它们的目的很不一一样。

1、适配器模式的意义是要将一个接口转变成另一个接口

2、装饰器模式不是要改变被装饰对象的接口,而是恰恰要保持原有的接口

1.2、示例代码

1.2.1、功能接口ShapeInter

public interface ShapeInter {

    void draw();

}

1.2.1.2、功能1 实现类RectangleImpl

public class RectangleImpl implements ShapeInter {

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

1.2.1.3、功能2 实现类 CircleImpl

public class CircleImpl implements ShapeInter {

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

1.2.2、抽象装饰器

public abstract class AbstractShapeDecorator implements ShapeInter {

    protected ShapeInter shapeInter;

    public AbstractShapeDecorator(ShapeInter shapeInter) {
        this.shapeInter = shapeInter;
    }

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

1.2.3、装饰器结果

public class RedShapeDecorator extends AbstractShapeDecorator {

    public RedShapeDecorator(ShapeInter shapeInter) {
        super(shapeInter);
    }

    @Override
    public void draw() {
        shapeInter.draw();
        ok();
    }

    private void ok(){
        System.out.println("Border Color: Red");
    }
}

1.2.4、测试

package com.hlj.moudle.design.D05_一致性.D12Decorator适配器模式;


public class Main {

    public static void main(String[] args) {

        ShapeInter circle = new CircleImpl();
        System.out.println("Circle with normal border");
        circle.draw();


        AbstractShapeDecorator redCircle = new RedShapeDecorator(new CircleImpl());
        System.out.println("\nCircle of red border");
        redCircle.draw();


        AbstractShapeDecorator redRectangle = new RedShapeDecorator(new RectangleImpl());
        System.out.println("\nRectangle of red border");
        redRectangle.draw();
    }
}