阅读 54

设计模式-装饰器模式

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

简述

装饰器模式是一种结构性的设计模式。由于开闭原则,当我们需要扩展类的功能的时候,我们不能直接对类进行修改,这时候就需要使用到装饰器模式。

开闭原则:对扩展开放、对修改关闭。

结构

img

装饰器模式主要由以下4种类组成:

  • Component接口: 抽象构件接口,装饰器中所有构件都实现了该接口,并在此接口定义了方法Operation()。
  • ConcreteComponent类: 具体实现类,实现了Component接口,是被装饰的对象,同时具体实现了方法Operation()。
  • Decorator类: 装饰器的抽象类,实现了Component接口,持有一个构件(Component)对象的实例。之所以实现了Component接口,是因为可以让每一个装饰器本身也可以被更外层的装饰器所包装,包装的方式就是把Component对象作为参数,传入到外层装饰器的构造函数当中。
  • ConcreteDecorator类: 具体装饰器类,继承了Decorator类,并在方法Operation()中定义,执行持有的Component具体实现类对象的Operation()自定义添加的行为方法.

实现

下面以汽车为例,进行代码实现。例子来源于漫画设计模式:什么是“装饰器模式”?

首先是Component接口Car.java

/**
 * @description:
 * @time: 2021/8/6 14:05
 */
public interface Car {
​
    /**
     * @description:
     * @param
     * @return: []
     * @time: 2021/8/6 14:06
     */
    public void run();
​
}
复制代码

ConcreteComponent类BMW.java

/**
 * @description:
 * @time: 2021/8/6 14:08
 */
public class BMW implements Car{
    @Override
    public void run() {
        System.out.println("宝马启动了!");
    }
}
复制代码

TESLA.java

/**
 * @description:
 * @time: 2021/8/6 14:09
 */
public class TESLA implements Car {
​
    @Override
    public void run() {
        System.out.println("特斯拉启动了!");
    }
}
​
复制代码

Decorator类CarDecorator.java

/**
 * @description:装饰器的抽象类
 * @time: 2021/8/6 14:13
 */
public abstract class CarDecorator implements Car{
​
    /**
     * @description:被装饰的对象或装饰器
     * @time: 2021/8/6 14:27
     */
    protected Car carDecorator;
​
    /**
     * @description:构造方法,初始化carDecorator
     * @time: 2021/8/6 14:28
     */
    public CarDecorator(Car carDecorator) {
        this.carDecorator = carDecorator;
    }
​
    /**
     * @description:
     * @time: 2021/8/6 14:32
     */
    @Override
    public void run() {
        carDecorator.run();
    }
}
复制代码

具体装饰器类AutoCarDecorator.java

/**
 * @description:
 * @time: 2021/8/6 14:33
 */
public class AutoCarDecorator extends CarDecorator{
    /**
     * @param carDecorator
     * @description:构造方法,初始化carDecorator
     * @time: 2021/8/6 14:28
     */
    public AutoCarDecorator(Car carDecorator) {
        super(carDecorator);
    }
​
    @Override
    public void run() {
        carDecorator.run();
        autoRun();
    }
​
    private void autoRun() {
        System.out.println("开启自动驾驶功能!");
    }
}
复制代码

FlyCarDecorator.java

/**
 * @description:
 * @time: 2021/8/6 14:42
 */
public class FlyCarDecorator extends CarDecorator{
​
    /**
     * @param carDecorator
     * @description:构造方法,初始化carDecorator
     * @time: 2021/8/6 14:28
     */
    public FlyCarDecorator(Car carDecorator) {
        super(carDecorator);
    }
​
    @Override
    public void run() {
        carDecorator.run();
        fly();
    }
​
    private void fly() {
        System.out.println("开启飞行功能!");
    }
}
复制代码

main方法

/**
 * @description:
 * @time: 2021/8/6 14:57
 */
public class Main {
    public static void main(String[] args) {
        BMW bmw = new BMW();
        TESLA tesla = new TESLA();
        AutoCarDecorator autoBMW = new AutoCarDecorator(bmw);
        FlyCarDecorator autoFlyTESLA = new FlyCarDecorator(new AutoCarDecorator(tesla));
        autoBMW.run();
        autoFlyTESLA.run();
    }
}
复制代码

执行结果如下:

image-20210806152705880

整个代码实现的类图如下:

image-20210806153134425

文章分类
后端
文章标签