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