裝飾設計模式就是對已有的對象的功能進行增強
簡單小例子:
class Person { void chifan() { System.out.println("chifan"); } } /* 為了不隨便改變原有的代碼。 還要增強chifan功能。 那麼就定義一個類,對原有對象進行裝飾。 by 何問起 */ class NewPerson { private Person p; NewPerson(Person p) { this.p = p; } public void newChifan() { System.out.println("來一杯"); p.chifan(); System.out.println("來一根"); } } class PersonDemo { public static void main(String[] args) { Person p = new Person(); //NewPerson np = new NewPerson(p); //np.newChifan(); p.chifan(); } } // hovertree.com
我們考慮一下使用繼承也可以對父類中的功能進行增強只需要調用super就可以調用父類的方法,那使用裝飾和繼承有什麼區別?
使用繼承體系就會有點臃腫,因為當平房想要改成歐式時,還要建立子類。
Writer
|--FileWriter
|--BufferedFileWriter。
|--DataWriter
|--BufferedDataWriter。
|--MediaWriter
|--BufferedMediaWriter.
優化:
可以將緩沖技術單獨抽取進行封裝。
要緩沖區誰將誰和緩沖相關聯即可。
這樣的設計的相對體系會變的簡單。
使用繼承帶來的局限性:
/* 房子:平房,樓房。 House |--PingFang |--LouFang 准備對房子進行裝修。 1,對平房進行田園風光式的打造。 2,對樓房進行歐式風格的打造。 可以用繼承的方式來完成。 House |--PingFang |--TianYuanPingFang |--LouFang |--OuShiLouFang 該體系就有點臃腫,因為當平房想要改成歐式時,還要建立子類。 何問起 hovertree.com */ abstract class House { abstract void show(); } class PingFang extends House { public void show() { System.out.println("平房"); } } class TianYuanPingFang extends PingFang { public void showTianYuan() { super.show(); System.out.println("田園風格"); } } class LouFang extends House { public void show() { System.out.println("樓房"); } } class OuShiLouFang extends LouFang { public void showOuShi() { super.show(); System.out.println("歐式風格"); } } class HouseDemo { public static void main(String[] args) { PingFang p = new PingFang(); ///p.show(); TianYuanPingFang t = new TianYuanPingFang(); t.showTianYuan(); LouFang l = new LouFang(); //l.show(); OuShiLouFang o = new OuShiLouFang(); o.showOuShi(); } }
使用裝飾設計模式進行裝飾:
/* 原體系: House |--PingFang |--LouFang 無論將平房打造成田園還是歐式,都是對平房一種裝修。 而該裝修也可以用樓房。 by 何問起 hovertree.com 將現將該裝修定義好,需要把什麼房子進行改裝修,傳入即可。 House |--PingFang |--LouFang |--TianYuan |--OuShi */ abstract class House { abstract void show(); } class PingFang extends House { public void show() { System.out.println("平房"); } } class LouFang extends House { public void show() { System.out.println("樓房"); } } class TianYuan extends House { private House h; TianYuan(House h) { this.h = h; } public void show() { System.out.println("田園風格"); } public void showTianYuan() { h.show(); this.show(); } } class OuShi extends House { private House h; OuShi(House h) { this.h = h; } public void show() { System.out.println("歐式風格"); } public void showOuShi() { h.show(); this.show(); } } class HouseDemo2 { public static void main(String[] args) { PingFang p = new PingFang(); LouFang l = new LouFang(); OuShi o = new OuShi(new TianYuan(p)); o.showOuShi(); //TianYuan t = new TianYuan(l); //t.showTianYuan(); //OuShi o = new OuShi(l); //o.showOuShi(); } }