您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java結構型設計模式之裝飾模式怎么實現”,在日常操作中,相信很多人在Java結構型設計模式之裝飾模式怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java結構型設計模式之裝飾模式怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
意圖:動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式相比生成子類更靈活。
主要解決:我們擴展一個類常使用繼承方式實現,由于繼承為類引入靜態特征,并且隨著擴展功能的增多,子類會越來越膨脹。
如何使用:在不想增加很多子類的情況下擴展。
如何解決:將具體功能職責劃分,同時繼承裝飾者模式。
關鍵代碼:
1. Component 類充當抽象角色,不應該具體實現。
2. 修飾類引用合繼承 Component 類,具體擴展類重寫父類方法。
使用場景:
1. 擴展一個類的功能。
2. 動態增加功能,動態撤銷。
創建一個 Shape 接口合實現了 Shape 接口的實體類。然后再創建一個實現了 Shape 接口的抽象裝飾類 ShapeDecorator,并把 Shape 對象作為它的實例變量。RedShapeDecorator 是實現了 ShapeDecorator 的實體類。DecoratorPatternDemo 類使用 RedShapeDecorator 來裝飾 Shape 對象。
步驟1:
public interface Shape{ void draw(); }
步驟2:
public class Rectangle implements Shape{ @Override public ovid draw(){ System.out.println("draw Rectangle"); } }
public class Cricle implements Shape{ @Override public ovid draw(){ System.out.println("draw Circle"); } }
步驟3:
public abstract class ShapeDecorator implements Shape{ private Shape shape; // 持有一個 Shape 對象 public ShapeDecorator(Shape shape){ this.shape = shape; } public void draw(){ shape.draw();// TODO 根據傳進來的具體 Shape 對象,調用對應的 draw 方法 } }
步驟4:
public class RedShapeDecorator extends ShapeDecorator{ public RedShapeDecorator(Shape shape){ super(shape); } @Override public void draw(){ shape.draw(); setRedBorder(shape); } public void setRedBorder(Shape shape){ System.out.println("Border Color: Red"); } }
步驟5
public class DecoratorPatterndDemo{ public static void main(String args[]){ //TODO 面向抽象層編程 // 普通的Circle Shape circle = new Circle(); System.out.println("Circle with normal Border"); circle.darw(); // 紅色邊界的 Circle ShapeDecorator redCircle = new RedShapeDecorator(new Circle); System.out.println("Circle of red Border"); redCircle.draw(); // 紅色邊界的 Rectangle ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangel): System.out.println("Rectangle of red Border"); redRectangle.draw(); } }
優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實現類的功能。
缺點:多層裝飾比較復雜。
到此,關于“Java結構型設計模式之裝飾模式怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。