作者主页:Designer 小郑
作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。

装饰模式是一种设计模式,属于结构型模式之一。
在 Java 中,装饰模式通过动态地将责任附加到对象上,以扩展其功能,它提供了一种比继承更灵活的方式来扩展对象的功能。
在装饰模式中,有一个基础对象(被装饰对象)和一系列装饰器(装饰对象)。
装饰器和基础对象实现同一个接口,这样它们可以相互替换。
装饰器包含一个基础对象的引用,并将新的功能添加到基础对象上。
使用装饰模式,我们可以 在运行时动态地扩展对象的功能,而不需要修改已有的代码 \color{red}{在运行时动态地扩展对象的功能,而不需要修改已有的代码} 在运行时动态地扩展对象的功能,而不需要修改已有的代码,它将对象的行为和功能的扩展分离开来,使得代码更加灵活可扩展。
下面是一个简单的Java代码示例,请同学们复制到本地执行。
// 定义口
public interface Shape {
void draw();
}
// 实现接口的基础对象
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("画一个圆形");
}
}
// 实现接口的装饰器
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
@Override
public void draw() {
decoratedShape.draw();
}
}
// 具体的装饰器
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder();
}
private void setRedBorder() {
System.out.println("添加红色边框");
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
Shape circle = new Circle();
// 使用装饰器功能扩展
Shape redCircle = new RedShapeDecorator(new Circle());
Shape redRectangle = new RedShapeDecorator(new Rectangle());
circle.draw(); // 输出:画一个圆形
redCircle.draw(); // 输出:画一个圆形,添加红色边框
redRectangle.draw(); // 输出:画一个长方,添加红色边框
}
}
在这个例子中,Circle是基础对象,ShapeDecorator是装饰器,RedShapeDecorator是具体的装饰器。
使用装饰器可以在运行时为基础对象添加新的功能,而不需要修改基础对象本的代码。

以下是一个简单的 Java 装饰模式的实例代码,请同学们复制到本地执行。
// 定义接口
interface Shape {
void draw();
}
// 实现接口的基础对象
class Circle implements Shape {
@Override
public void draw() {
System.out.println("画一个圆形");
}
}
// 实现接口的装饰器
abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
@Override
public void draw() {
decoratedShape.draw();
}
}
// 具体的装饰器
class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder();
}
private void setRedBorder() {
System.out.println("添加红色边框");
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
Shape circle = new Circle();
// 使用装饰器功能扩展
Shape redCircle = new RedShapeDecorator(new Circle());
Shape redRectangle = new RedShapeDecorator(new Rectangle());
circle.draw(); // 输出:画一个圆形
redCircle.draw(); // 输出:画一个圆形,添加红色边框
redRectangle.draw(); // 输出:画一个长方形,添加红色边框
}
}
在这个例子中,Circle是基础对象,ShapeDecorator是装饰器,RedShapeDecorator是具体的装饰器。
使用装饰器可以在运行时为基础对象添加新的功能,而不需要修改基础对象本身的代码。
通过创建具体的装饰器并传入基础对象,可以动态地扩展对象的功能。

装饰模式在以下 4 4 4 种情况下使用,请同学们有个基本的了解。
当然,装饰模式的应用场景有以下 4 4 4 类,请同学们认真学习。
总之,装饰模式在需要动态地为对象添加功能、扩展对象的行为且不改变原有代码的情况下,提供了一种灵活且可复用的方案。

