當我們想要改進或增強某個物件的功能,而又不想繼承該類別建立子類,可以考慮使用裝飾模式。
使用裝飾模式增強物件的某個功能,比生成子類別再增強,更為靈活。
1)抽像元件:定義一個抽象類,該抽象類別定義了「被裝飾者」需要被「裝飾的方法」
#2 )具體組件:抽象組件的子類別。成為「被裝飾類別」
3)裝飾元件:也是抽像元件的子類別。該類別中持有「被裝飾者」的引用,用來呼叫被裝飾者的方法。可以為抽象類,也可以是非抽象類別。
4)具體裝飾類別:是裝飾元件的子類,稱為「裝飾者」
1)抽像元件
/** * 抽象组件,定义了被装饰类需要装饰的方法 */ public abstract class ICake { /** * 需要装饰的方法 * @return */ public abstract int getPrice(); }
2)被裝飾者
/** * 被装饰者,是抽象组件的一个子类,定义需要被装饰的方法 */ public class Cake extends ICake { /** * 被装饰类中,装饰方法的基本实现 * @return */ @Override public int getPrice() { System.out.println("getPrice"); return 100; } }
3)裝飾類別
/** * 装饰类,也是抽象组件的一个子类。 * 可以是抽象类,也可以是非抽象类。 */ public abstract class CakeDecorator extends ICake { /** * 被装饰类的引用,需要在装饰类中,调用到被装饰类的方法。 */ ICake cake; public CakeDecorator(ICake cake){ this.cake = cake; } }
4)具體裝飾
/** * 具体装饰类 */ public class BlueBerryCake extends CakeDecorator { public BlueBerryCake(ICake cake) { super(cake); } /** * 被装饰的方法 * 在调用到被装饰类的基础方法后,还要调用装饰类要增强的方法 * @return */ @Override public float getPrice(){ return cake.getPrice()+elsePrice(); } /** * 增强的方法 * @return */ private float elsePrice(){ System.out.println("else getPrice"); return 50; } }
5)測試類別
public class TestDecorator { public static void main(String args[]){ ICake cake = new Cake(); CakeDecorator decorater = new BlueBerryCake(cake); float price = decorater.getPrice(); System.out.println(price); } }
1)利用子類別繼承也能實現某個方法的增強。相較於透過裝飾模式實現,裝飾模式有和優勢?
被裝飾者和裝飾者是松耦合關係。裝飾類別僅依賴抽像元件,裝飾類別只需要知道被裝飾類別是抽像元件的子類,而不必知道具體是哪個子類別。
裝飾模式滿足“開-閉原則”,不必修改特定組件,就可以增加針對該組件的裝飾類別。
java.IO套件中的許多類別使用了裝飾模式。
Reader
FileReader
BufferdReader
##以上是Java設計模式之裝飾模式的原理及實作方法是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!