Java設計模式之裝飾模式詳解
1.什麼是裝飾模式
當我們想要改進或增強某個對象的功能,而又不想繼承該類創建子類,可以考慮使用裝飾模式。
使用裝飾模式增強對象的某個功能,比生成子類再增強,更為靈活。
2.如何實現
1)抽象組件:定義一個抽象類,該抽象類定義瞭“被裝飾者”需要被“裝飾的方法”
2)具體組件:抽象組件的一個子類。成為“被裝飾類”
3)裝飾組件:也是抽象組件的一個子類。該類中持有“被裝飾者”的引用,用來調用被裝飾者的方法。可以為抽象類,也可以是非抽象類。
4)具體裝飾類:是裝飾組件的一個子類,被稱為“裝飾者”
3.代碼實現
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); } }
4.拓展
1)利用子類繼承也能實現某個方法的增強。相比通過裝飾模式實現,裝飾模式有和優勢?
被裝飾者和裝飾者是松耦合關系。裝飾類僅僅依賴於抽象組件,裝飾類隻需要知道被裝飾類是抽象組件的一個子類,而不必知道具體是哪個子類。
裝飾模式滿足“開-閉原則”,不必修改具體組件,就可以增加針對該組件的裝飾類。
5.JavaIo與裝飾模式
java.IO包中的很多類使用瞭裝飾模式。
Reader
FileReader
BufferdReader
到此這篇關於Java設計模式之裝飾模式詳解的文章就介紹到這瞭,更多相關Java裝飾模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!