深入淺出學習和掌握Java中的裝飾器設計模式1.概述
今天java實現設計模式,來討論一種眾所周知且常用的模式,稱為裝飾器設計模式()java實現設計模式,簡稱裝飾模式 。通過下面簡要描述,來初步掌握裝飾模式的內涵精髓 。
裝飾器設計模式允許我們動態地向對象添加功能和行為,而不會影響同一類中其他現有對象的行為 。
我們使用繼承來擴展類的行為 。這發生在編譯時,該類的所有實例都獲得擴展行為 。
裝飾器設計模式允許我們在運行時向對象(而不是類)添加功能 , 并且可以根據我們的要求和選擇將此自定義功能應用于單個對象 。
● 裝飾器模式允許用戶在不改變其結構的情況下向現有對象添加新功能 。因此,原始類沒有變化 。
● 裝飾器設計模式是一種結構模式,它為現有類提供了一個包裝器 。
● 裝飾器設計模式使用抽象類或接口與組合來實現包裝器 。
● 裝飾器設計模式創建裝飾器類,它包裝原始類并通過保持類方法的簽名不變來提供其他功能 。
● 裝飾器設計模式最常用于應用單一責任原則 , 其由于我們將功能劃分為具有獨特領域的類 。
● 裝飾設計模式在結構上類似于責任鏈模式 。
讓我們通過一個例子以便來更好地理解裝飾器設計模式場景和應用 。
【教學實踐:深入淺出學習和掌握Java中的裝飾器設計模式】2.裝飾模式實現步驟2.1.設計接口和實現類
假設我們有一個Shape接口,它可以包括draw() , (),()和() 。
清單-1:Shape接口代碼
package design.decorator;public interface Shape { void draw(); void resize(); String description(); boolean isHide();}
現在 , 我們有兩個具體的Shape類——和,用來定義特定的形狀 。
下面是的代碼
清單-2:類代碼
package design.decorator;public class Circle implements Shape {@Overridepublic void draw() { System.out.println("Drawing Circle");}@Overridepublic void resize() { System.out.println("Resizing Circle");}@Overridepublic String description() { return "Circle object";}@Overridepublic boolean isHide() {return false;}}
清單-3: 類代碼
package design.decorator;public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing Rectangle");}@Overridepublic void resize() {System.out.println("Resizing Rectangle");}@Overridepublic String description() {return "Rectangle object";}@Overridepublic boolean isHide() {return false;}}
2.2.設計實現裝飾器抽象類
現在,我們來看看裝飾部分 。到目前為止,一切都很好,我們可以畫圓和矩形( 和 ) 。但是 , 我們希望為Shape提供一些額外的功能 , 如填充顏色、線條顏色、線條細度,線條樣式等 。
首先 , 我們將創建一個實現Shape的抽象包裝器(裝飾器)類 。我將在這個例子中使用 。
清單-4:裝飾器抽象類
package design.decorator;public abstract class ShapeDecorator implements Shape {protected Shape decoratedShape;public ShapeDecorator(Shape decoratedShape) {super();this.decoratedShape = decoratedShape;}}
定義為抽象類以避免任何直接實例化,因為這只是一個包裝器并且不會在Shape中添加任何功能 。另外,我已經實現了Shape,允許在這種情況下為所有已定義的具體Shape類(和)添加其他功能 。
另外,(在實際應用中根據需要 , 創建一些必要的的輔助類)為形狀創建Color和的枚舉 。下面是Color的枚舉:
清單-5:Color枚舉
package design.decorator;public enum Color {RED,GREEN,BLUE,YELLOW,WHITE,BLACK,ORANGE,MAROON}
清單-6:枚舉
package design.decorator;public enum LineStyle {SOLID,DASH,DOT,DOUBLE_DASH,DASH_SPACE}
2.3.實現裝飾器實體類
主要包括4個裝飾器實現類,分別填充顏色、線條顏色、線條細度,線條樣式4個裝飾器實現類 。分別描述如下:
創建以在形狀中添加填充顏色的功能 。
清單-7:類代碼
package design.decorator;public class FillColorDecorator extends ShapeDecorator {protected Color color;public FillColorDecorator(Shape decoratedShape, Color color) {super(decoratedShape);this.color = color;}@Overridepublic void draw() {decoratedShape.draw();System.out.println("Fill Color: " + color);}// 沒有改變功能// 如果喜歡可以添加功能. 除了維護Shape API的結構外,沒有限制@Overridepublic void resize() {decoratedShape.resize();}@Overridepublic String description() {return decoratedShape.description() + " filled with " + color + " color.";}// 功能沒有改變@Overridepublic boolean isHide() {return decoratedShape.isHide();}}
創建以在形狀中添加線條顏色的功能 。
清單-8:類代碼

文章插圖

文章插圖
package design.decorator;public class LineColorDecorator extends ShapeDecorator {protected Color color;public LineColorDecorator(Shape decoratedShape, Color color) {super(decoratedShape);this.color = color;}@Overridepublic void draw() {decoratedShape.draw();System.out.println("Line Color: " + color);}// 功能不變@Overridepublic void resize() {decoratedShape.resize();}@Overridepublic String description() {return decoratedShape.description() + " drawn with " + color + " color.";}// 功能不變@Overridepublic boolean isHide() {return decoratedShape.isHide();}}
創建or以在形狀中添加自定義線條粗細的功能 。
清單-9:or類
package design.decorator;public class LineThinknessDecorator extends ShapeDecorator {protected double thickness;public LineThinknessDecorator(Shape decoratedShape, double thickness) {super(decoratedShape);this.thickness = thickness;}@Overridepublic void draw() {decoratedShape.draw();System.out.println("Line thickness: " + thickness);}// 功能不變@Overridepublic void resize() {decoratedShape.resize();}@Overridepublic String description() {return decoratedShape.description() + " drawn with line thickness " + thickness + ".";}// 功能不變@Overridepublic boolean isHide() {return decoratedShape.isHide();}}
創建以在形狀中添加自定義線型的功能 。
清單-10: 類代碼
package design.decorator;public class LineStyleDecorator extends ShapeDecorator {protected LineStyle style;public LineStyleDecorator(Shape decoratedShape, LineStyle style) {super(decoratedShape);this.style = style;}@Overridepublic void draw() {decoratedShape.draw();System.out.println("Line Style: " + style);}// 功能不變@Overridepublic void resize() {decoratedShape.resize();}@Overridepublic String description() {return decoratedShape.description() + " drawn with " + style + " lines.";}//功能不變@Overridepublic boolean isHide() {return decoratedShape.isHide();}}
2.4.創建裝飾器調用主程序
創建一個示例主程序來執行和測試裝飾器代碼 。
清單-11:調用測試主類
package design.decorator;public class Main {public static void main(String[] args) {System.out.println("Creating Simple Shape Objects...");Shape rectangle = new Rectangle();Shape circle = new Circle();System.out.println("Drawing Simple Shape Objects...");rectangle.draw();System.out.println();circle.draw();System.out.println();System.out.println("Creating Decorated Circle with Red Color, Blue Lines in dash pattern and thickness of 2 ...");Shape circle1 = new FillColorDecorator(new LineColorDecorator(new LineStyleDecorator(new LineThinknessDecorator(new Circle(), 2.0d), LineStyle.DASH), Color.BLUE), Color.RED);circle1.draw();System.out.println();// 這里裝飾器順序不是非常重要 , 因為相應裝飾器功能單一.// 我們也可以在單獨的語句中嵌套功能來實現 。System.out.println("creating object with similar functionalities in separate statements.");Circle c = new Circle();LineThinknessDecorator lt = new LineThinknessDecorator(c, 2.0d);LineStyleDecorator ls = new LineStyleDecorator(lt, LineStyle.DASH);LineColorDecorator lc = new LineColorDecorator(ls, Color.BLUE);FillColorDecorator fc = new FillColorDecorator(lc, Color.RED);Shape circle3 = fc;circle3.draw();System.out.println();System.out.println("Creating Decorated Circle with Green Color, Black Lines ...");Shape circle2 = new FillColorDecorator(new LineColorDecorator(new Circle(), Color.BLACK), Color.GREEN);circle2.draw();System.out.println();System.out.println("Creating Decorated Rectange with Yellow Color, Red Lines in double dash pattern...");Shape rectangle1 = new FillColorDecorator(new LineColorDecorator(new Rectangle(), Color.RED), Color.YELLOW);rectangle1.draw();System.out.println();}}
運行程序輸出參考結果如下:
Shape …
Shape …
with Red Color, Blue Lines in dashandof 2 …
Line : 2.0
Line Style: DASH
Line Color: BLUE
Fill Color: RED
within.
Line : 2.0
Line Style: DASH
Line Color: BLUE
Fill Color: RED
with Green Color, Black Lines …
Line Color: BLACK
Fill Color: GREEN
withColor, Red Lines indash …
Line Color: RED
Fill Color:
可以看到,我們沒有更改核心類——Shape,和 。只是通過創建包裝器和裝飾器類,我們添加并自定義了Shape,和的行為 , 并已完成它們 。通過這個示例,希望我們現在對裝飾設計模式很清楚 。
裝飾器模式的應用,這里主要要注意的就是這樣幾點:
1) 接口和實現類——需要裝飾的對象類;
2) 抽象裝飾器類——實現不破壞已有實現類的包裝;
3) 實現裝飾器類——基于不同的需要,完成各自最終的裝飾工作 。
好了,就寫這些了 。就請多本頭條號吧^_^
本文到此結束,希望對大家有所幫助 。
- 當下教育的困惑是什么?是課程內容、教學形式、還是教育觀念?
- 下一代云桌面在教育行業應用的實踐探索
- 小學數學教學論文怎么寫
- 大腦研究如何啟迪學習和教學?
- 如何在教學目標中落實核心素養2~雙基三維目標核心素養之間關系
- 基于Apache Flink實時計算數據流業務引擎在京東零售的實踐和落地
- 如何做好主數據管理項目落地,附方法論與實踐步驟
- 【知行曉莊】基于“人際交往”主題的小學心理課堂教學策略探析——記第16周棲霞區小
- 上 月入破萬!抖音王者換頭剪輯教學
- 【教學】如何更換AirTag的電池?
