“这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战”
简述
装饰器模式是一种结构性的设计模式。由于开闭原则,当我们需要扩展类的功能的时候,我们不能直接对类进行修改,这时候就需要使用到装饰器模式。
开闭原则:对扩展开放、对修改关闭。
结构
装饰器模式主要由以下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();
}
}
执行结果如下:
整个代码实现的类图如下: