装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
    这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

    就是现有的接口不能完全满足要求,需要增强才能使用。用一个抽象类实现之前的接口,然后自己的类实现抽象类,在真的接口调用的前后,增加其他功能。

    接口类 有一个deaw( ) 方法

    1. /**
    2. * @author meikb
    3. * @desc 形状接口 有一个 “画” 的方法
    4. * @date 2020-05-23 15:00
    5. */
    6. public interface Shape {
    7. public void draw();
    8. }

    圆形实现类

    1. /**
    2. * @author meikb
    3. * @desc 圆形实现类
    4. * @date 2020-05-23 15:03
    5. */
    6. public class Circle implements Shape{
    7. @Override
    8. public void draw() {
    9. System.out.println("画圆形");
    10. }
    11. }

    长方形实现类

    1. /**
    2. * @author meikb
    3. * @desc 长方形实现类
    4. * @date 2020-05-23 15:02
    5. */
    6. public class Rectangle implements Shape{
    7. @Override
    8. public void draw() {
    9. System.out.println("画长方形");
    10. }
    11. }

    通过抽象类 实现接口 来达到修改增强接口的目的

    1. /**
    2. * @author meikb
    3. * 老接口前后可能增加其他功能 需要修改
    4. * @desc 装饰器模式最核心的思想就是 :用一个抽象类实现之前的接口,然后自己的类实现抽象类,在真的接口调用的前后,增加其他功能。
    5. * @date 2020-05-23 15:04
    6. */
    7. public abstract class ShapeDecorator implements Shape{
    8. private Shape decoratedShape;
    9. public ShapeDecorator(Shape shape){
    10. this.decoratedShape = shape;
    11. }
    12. @Override
    13. public void draw() {
    14. decoratedShape.draw();
    15. }
    16. }

    抽象类继承

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-23 15:14
    5. */
    6. public class RedShapeDecorator extends ShapeDecorator{
    7. public RedShapeDecorator(Shape shape) {
    8. super(shape);
    9. }
    10. @Override
    11. public void draw() {
    12. super.draw();
    13. setRedBorder();
    14. }
    15. private void setRedBorder() {
    16. System.out.println("把颜色涂为红色!");
    17. }
    18. }

    主函数

    1. public class DecoratorMain {
    2. public static void main(String[] args) {
    3. Circle circle = new Circle();
    4. RedShapeDecorator redShapeDecorator = new RedShapeDecorator(circle);
    5. redShapeDecorator.draw();
    6. //一般情况下, 直接调用 circle.draw() 方法 但是需要修改这个方法 但是又不破话之前的结构 就使用 装饰器模式
    7. }
    8. }