裝飾者模式目標
把許多要實現的功能,加載在子類上,類的繼承,顯得很臃腫,裝飾着模式是在不改變原有類文件和使用繼承的情況下,通過創建一個包裝對象動態地擴展一個對象的功能,相比生成子類更為靈活
裝飾者模式角色
- 抽象組件角色
給出一個抽象接口
- 具體組件角色
定義一個將要增加附加功能的類,相當於父類
- 抽象裝飾者角色
持有一個組件對象的實例,並且實現抽象組件接口
- 具體裝飾者角色
負責給組件對象添加附加的功能,相當於子類
裝飾者模式示例
以一件商品被賣出為例
//抽象組件角色 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(); } }
代碼運行結果為:
|
裝飾者模式和繼承的區別 繼承實現的增強類:
|