装饰器设计模式允许我们动态地向对象添加功能,而不影响同一类对象的行为。听起来有点令人困惑,但是一旦你看到代码,一切都会变得更清晰。 特点 - 装饰器允许您向现有对象添加功能而不改变其结构,即原始类不会改变 - 装饰器设计模式是一种结构模式,为现有类提供包装器 - 装饰器类的创建包装原始类并提供附加功能,同时完整保留原始类的方法签名 - 装饰器设计模式最常用于遵循 SOLID 的单一职责原则,因为我们不会加载原始类的附加职责,而是将它们分开到装饰器类中 - 装饰器在结构上几乎类似于责任链模式(chain of Responsible) 必须考虑以下关键点 - 装饰器对于能够在运行时修改对象的行为很有用。这段代码很容易维护和扩展。- 这种模式的缺点是使用大量相同类型的装饰器对象 - 装饰器模式经常用于 Java IO 类(FileReader、BufferedReader 等) 我们将做什么 - 创建接口 - 创建具体该接口的实现 - 创建一个抽象装饰器,实现该接口 - 让我们创建一个继承抽象装饰器的具体装饰器 - 使用具体装饰器来“装饰”接口的具体实现 实现 : 我们将创建 Shape 接口和具体类实现这个接口。接下来,我们将创建一个抽象装饰器类 ShapeDecorator,它实现 Shape 接口并具有一个 Shape 对象作为类字段。 - Shape 是接口的名称 - Rectangle、Triangle 和 Circle 类将是实现 Shape 接口的具体类 - ShapeDecorator 是实现相同 Shape 接口的抽象装饰器类 - RedShapeDecorator 是实现 ShapeDecorator 的具体类 - 演示是一个演示类,我们将在其中使用 RedShapeDecorator 来装饰 Shape 对象 第 1 步:创建 Shape 接口
public interface Shape {
void draw();
}
第 2 步:让我们创建该接口的几个实现。在下面的示例中,只有一个圆形,但实际上我们将创建更多几个:一个矩形和一个三角形。
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("Я круг!");
}
}
步骤 3:创建一个实现 Shape 接口的抽象装饰器
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
//Конструктор, принимающий an object Shape
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
public void draw() {
decoratedShape.draw();
}
}
第四步:创建一个继承抽象类的具体装饰器类
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("Сообщение от RedShapeDecorator. Цвет границы: красный");
}
}
第 5 步:使用 RedShapeDecorator 为我们的对象着色
public class Demo {
public static void main(String[] args)
{
Shape circle = new Circle();
Shape redCircle= new RedShapeDecorator(new Circle());
Shape redRectangle= new RedShapeDecorator(new Rectangle());
Shape redTriangle = new RedShapeDecorator(new Triangle());
System.out.println("\nОбычный круг:");
circle.draw();
System.out.println("\nКруг с красной границей:");
redCircle.draw();
System.out.println("\nПрямоугольник с красной границей:");
redRectangle.draw();
System.out.println("\nТреугольник с красной границей:");
redTriangle.draw();
}
}
第6步:看看控制台,欣喜若狂
Обычный круг:
Я круг!
Круг с красной границей:
Я круг!
Сообщение от RedShapeDecorator. Цвет границы: красный
Прямоугольник с красной границей:
Я прямоугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный
Треугольник с красной границей:
Я треугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный
以装饰器设计模式为例进行分析后,我们可以得出结论,在以下情况下使用它是合理的: - 当我们想要添加、改进或可能删除对象的行为或状态时 - 当我们只是想更改功能时类的一个特定对象,其余部分保持不变,谢谢! 包含项目文件的存储库 基于geeksforgeeks.org 网站上的 一篇文章我的Java 开发初学者 博客
GO TO FULL VERSION