欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

装饰者模式(Decorator Pattern)

程序员文章站 2022-07-13 22:05:27
...

一般,实现对象增强有三种方式:

  1. 继承
  2. 装饰者模式
  3. 代理模式

装饰者模式(Decorator Pattern)


装饰者模式:

这个模式是结构型模式,它允许向一个现有的对象添加新的功能,同时又不改变它的结构。



我 们 为 什 么 使 用 装 饰 者 模 式 呢 ? 或 者 说 什 么 场 景 需 要 用 这 个 模 式 我们为什么使用装饰者模式呢? 或者说什么场景需要用这个模式 使

一般的,我们为了扩展一个类的功能,需要去继承实现,由于继承会引入父类的一些静态特征, 并且随着扩展功能的增多,子类会越来越膨胀。

装饰者模式(Decorator Pattern)


动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

在不想增加很多子类的时候可以使用装饰者模式来扩展类。



装饰者模式代码大概分为以下几个部分

Shape 模型接口
Circle 圆形类
Rectangle 矩形类
ShapeDecorator(抽象的) 模型接口的装饰类(我们创建的装饰类就是这个)
RedShapeDecorator(扩展功能) 装饰类的实现类(真正扩展的地方)

Shape 模型接口


/**
 * @author lankeren
 *
 *  模型
 */
public interface Shape {
    void draw();
}



Circle 圆形类

/**
 * @author lankeren
 * @ClassName Circle  圆形
 * @Deacription:
 * @create: 2020-11-14 22:18
 */
public class Circle implements Shape{

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

}



Rectangle 矩形类

/**
 * @author lankeren
 * @ClassName Rectangle  矩形
 * @Deacription:
 * @create: 2020-11-14 22:16
 */
public class Rectangle implements Shape{

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

}


ShapeDecorator 模型接口装饰类

创建了一个装饰类,用来包装原有的类

/**
 * @author lankeren
 * @ClassName ShapeDecorator 模型的装饰者
 * @Deacription:
 * @create: 2020-11-14 22:19
 */
public abstract class ShapeDecorator implements Shape{
    protected Shape decoratedShape;

    // 构造器
    public ShapeDecorator(Shape decoratedShape) {
        this.decoratedShape = decoratedShape;
    }

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

}



装饰类的实现类 (真正的扩展方法)

/**
 * @author lankeren
 * @ClassName RedShapeDecorator
 * @Deacription:
 * @create: 2020-11-14 22:21
 */
public class RedShapeDecorator extends ShapeDecorator {
    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

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

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

}


测试入口


/**
 * @author lankeren
 * @ClassName DecoratorPatternDemo
 * @Deacription:
 * @create: 2020-11-14 22:24
 */
public class DecoratorPatternDemo {

    public static void main(String[] args) {
        Shape circle = new Circle();
        ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
        ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());

        System.out.println(" -- ");
        circle.draw();

        System.out.println(" -- ");
        redCircle.draw();

        System.out.println(" -- ");
        redRectangle.draw();


    }
}





装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。


装饰者模式可以代替原有类的继承



对装饰者模式的理解

装饰者模式(Decorator Pattern)

MusicPhone
装饰者模式(Decorator Pattern)
GiveCurrentTimePhone
装饰者模式(Decorator Pattern)


// 先增强听音乐的功能,再增强通知时间的功能
    Phone phone = new GiveCurrentTimePhone(new MusicPhone(new IphoneX()));

想要扩展什么功能,就继承PhoneDecorate装饰器抽象类,将想要增强的对象(最简单的实现类iPhoneX或者已经被增强过的对象)传进去,完成我们的扩展!


(装饰者重写方法,继承着装饰者来扩展(添加扩展方法—重写方法))

装饰者模式(Decorator Pattern)





在 Java 的 I/O 中使用到了 装饰者模式 >> 这块内容待补

装饰者模式(Decorator Pattern)



装饰者模式(Decorator Pattern)



装饰者模式(Decorator Pattern)






部分参考: 设计模式之装饰者模式
部分参考:Java3y