您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Java設計模式中的裝飾器模式怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java設計模式中的裝飾器模式怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的實例來演示裝飾器模式的用法。其中我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類。
意圖: 動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更為靈活。
主要解決: 一般我們為了擴展一個類經常使用繼承方式實現,由于繼承為類引入靜態特征,并且隨著擴展功能的增多,子類會很膨脹。
何時使用: 在不想增加很多子類的情況下擴展類。
如何解決: 將具體功能職責劃分,同時繼承裝飾者模式。
關鍵代碼:
1.Component類充當抽象角色,不應該具體實現。
⒉修飾類引用和繼承Component類,具體擴展類重寫父類方法。
應用實例:
1.孫悟空有72變,當他變成"廟宇"后,他的根本還是一只猴子,但是他又有了廟宇的功能。
2.不論一幅畫有沒有畫框都可以掛在墻上,但是通常都是有畫框的,并且實際上是畫框被掛在墻上。在掛在墻上之前,畫可以被蒙上玻璃,裝到框子里;這時畫、玻璃、畫框形成了一個物體。
優點: 裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實現類的功能。
缺點: 多層裝飾比較復雜。
使用場景:
1.擴展一個類的功能。
⒉動態增加功能,動態撤銷。
注意事項: 可代替繼承。
我們將創建一個Shape接口和實現了Shape接口的實體類。然后我們創建一個實現了Shape接口的抽象裝飾類ShapeDecorator,并把Shape對象作為它的實例變量。
RedShapeDecorator是實現了ShapeDecorator的實體類。
DecoratorPatternDemo類使用RedShapeDecorator來裝飾Shape對象。
1.創建一個項目名稱為decorator_pattern的Java項目。
2.創建一個圖形接口Shape。
/** * 繪制圖形接口 */ public interface Shape { void draw(); }
3.創建圖形實現類
public class Rectangle implements Shape{ @Override public void draw() { System.out.println("繪制矩形"); } }
public class Circle implements Shape{ @Override public void draw() { System.out.println("繪制圓形"); } }
4.創建圖形類的抽象裝飾器
/** * 裝飾器的規范,具體裝飾的實現,可以讓具體的子類裝飾器來實現具體的裝飾效果 */ public abstract class ShapeDecorator implements Shape{ //目標裝飾的對象 public Shape shape; public ShapeDecorator(Shape shape) { this.shape = shape; } //1.目標方法的調用shape.draw() //2.需要擴展新功能(起到了裝飾效果) @Override public void draw() { //1.目標方法的調用shape.draw() shape.draw(); //2.需要擴展新功能(起到了裝飾效果) //System.out.println("當前圖形填充成紅色"); } }
5.創建圖形類的具體裝飾器
public class RedShapeDecorator extends ShapeDecorator{ //調用具體的裝飾器類來初始化圖形對象 public RedShapeDecorator(Shape shape) { super(shape); } @Override public void draw() { //1.目標業務邏輯 super.draw(); //2.擴展新功能:就是裝飾器的核心代碼 setRedColor(); } private void setRedColor(){ System.out.println("圖形被填充成紅色!"); } }
6.創建程序入口
public class DecoratorPattern { public static void main(String[] args) { Shape circle=new Circle(); ShapeDecorator redCircle=new RedShapeDecorator(circle); redCircle.draw(); } }
7.結果
public class DecoratorPattern { public static void main(String[] args) { Shape circle=new Circle(); ShapeDecorator redCircle=new RedShapeDecorator(circle); redCircle.draw(); } }
讀到這里,這篇“Java設計模式中的裝飾器模式怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。