java 裝飾者模式與繼承的區別


裝飾者模式目標

把許多要實現的功能,加載在子類上,類的繼承,顯得很臃腫,裝飾着模式是在不改變原有類文件和使用繼承的情況下,通過創建一個包裝對象動態地擴展一個對象的功能,相比生成子類更為靈活

裝飾者模式角色

  • 抽象組件角色

給出一個抽象接口

  • 具體組件角色

定義一個將要增加附加功能的類,相當於父類

  • 抽象裝飾者角色

持有一個組件對象的實例,並且實現抽象組件接口

  • 具體裝飾者角色

負責給組件對象添加附加的功能,相當於子類

 

裝飾者模式示例

以一件商品被賣出為例

//抽象組件角色 Commodity.java

public interface Commodity { public void beSoldOut(); } //具體組件角色

public class Book implements Commodity { @Override public void beSoldOut() { System.out.println("書被賣出去了"); } } //抽象裝飾者角色
//實現了抽象組件接口
public abstract class Decorator implements Commodity { Commodity commodity; //持有組件對象的實例 Decorator(Commodity commodity){ this.commodity=commodity; } @Override public void beSoldOut() { commodity.beSoldOut(); } } //具體裝飾者角色:增加了折扣的功能

public class DiscountDecorator extends Decorator { public DiscountDecorator(Commodity commodity) { super(commodity); } public void discount(){ System.out.println("再送一件相同的商品"); } @Override public void beSoldOut() { // TODO Auto-generated method stub super.beSoldOut(); discount(); } } //具體裝飾者角色:再次折扣促銷


public class DiscountAgainDecorator extends Decorator { public DiscountAgainDecorator(Commodity commodity){ super(commodity); } public void discountAgain(){ System.out.println("再送一件價格低一點的商品"); } @Override public void beSoldOut() { super.beSoldOut(); discountAgain(); } } //客戶端測試類 testDecorator.java
public class testDecorator { public void static main(String[] args) { Commodity book = new Book(); Decorator decorator = new DiscountAgainDecorator(new DiscountDecorator(book)); decorator.beSoldOut(); } }

 

 代碼運行結果為:

書被賣出去了 再送一件相同的商品 再送一件價格低一點的商品

 

 

裝飾者模式和繼承的區別

繼承實現的增強類:
  優點:代碼結構清晰,而且實現簡單
  缺點:對於每一個的需要增強的類都要創建具體的子類來幫助其增強,這樣會導致繼承體系過於龐大。


裝飾模式實現的增強類:
  優點:內部可以通過多態技術對多個需要增強的類進行增強
  缺點:需要內部通過多態技術維護需要增強的類的實例。進而使得代碼稍微復雜。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM