JavaRush /Java Blog /Random-TW /裝飾器設計模式與範例
Sbv239
等級 23
Санкт-Петербург

裝飾器設計模式與範例

在 Random-TW 群組發布
裝飾器設計模式允許我們動態地在物件上添加功能,而不影響同一類別物件的行為。聽起來有點令人困惑,但是一旦你看到程式碼,一切都會變得更清晰。 特點 - 裝飾器可讓您為現有物件添加功能而不改變其結構,即原始類別不會改變 - 裝飾器設計模式是一種結構模式,為現有類別提供包裝器 - 裝飾器類別的創建包裝原始類別並提供附加功能,同時完整保留原始類別的方法簽名- 裝飾器設計模式最常用於遵循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