JavaRush /Java 博客 /Random-ZH /装饰器设计模式与示例
Sbv239
第 23 级
Санкт-Петербург

装饰器设计模式与示例

已在 Random-ZH 群组中发布
装饰器设计模式允许我们动态地向对象添加功能,而不影响同一类对象的行为。听起来有点令人困惑,但是一旦你看到代码,一切都会变得更清晰。 特点 - 装饰器允许您向现有对象添加功能而不改变其结构,即原始类不会改变 - 装饰器设计模式是一种结构模式,为现有类提供包装器 - 装饰器类的创建包装原始类并提供附加功能,同时完整保留原始类的方法签名 - 装饰器设计模式最常用于遵循 SOLID 的单一职责原则,因为我们不会加载原始类的附加职责,而是将它们分开到装饰器类中 - 装饰器在结构上几乎类似于责任链模式(chain of Responsible) 必须考虑以下关键点 - 装饰器对于能够在运行时修改对象的行为很有用。这段代码很容易维护和扩展。- 这种模式的缺点是使用大量相同类型的装饰器对象 - 装饰器模式经常用于 Java IO 类(FileReader、BufferedReader 等) 我们将做什么 - 创建接口 - 创建具体该接口的实现 - 创建一个抽象装饰器,实现该接口 - 让我们创建一个继承抽象装饰器的具体装饰器 - 使用具体装饰器来“装饰”接口的具体实现 实现 我们将创建 Shape 接口和具体类实现这个接口。接下来,我们将创建一个抽象装饰器类 ShapeDecorator,它实现 Shape 接口并具有一个 Shape 对象作为类字段。 装饰器设计模式示例 - 1 - 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 开发初学者 博客
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION