簡單小例子:
- class Person
- {
- void chifan()
- {
- System.out.println("chifan");
- }
- }
- /*
- 爲了不隨便改變原有的代碼。
- 還要增強chifan功能。
- 那麼就定義一個類,對原有對象進行裝飾。
- */
- 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();
- }
- }
我們考慮一下使用繼承也可以對父類中的功能進行增強只需要調用super就可以調用父類的方法,那使用裝飾和繼承有什麼區別?
使用繼承體系就會有點臃腫,因爲當平房想要改成歐式時,還要建立子類。
Writer
|--FileWriter
|--BufferedFileWriter。
|--DataWriter
|--BufferedDataWriter。
|--MediaWriter
|--BufferedMediaWriter.
優化:
可以將緩衝技術單獨抽取進行封裝。
要緩衝區誰將誰和緩衝相關聯即可。
這樣的設計的相對體系會變的簡單。
使用繼承帶來的侷限性:
- /*
- 房子:平房,樓房。
- House
- |--PingFang
- |--LouFang
- 準備對房子進行裝修。
- 1,對平房進行田園風光式的打造。
- 2,對樓房進行歐式風格的打造。
- 可以用繼承的方式來完成。
- House
- |--PingFang
- |--TianYuanPingFang
- |--LouFang
- |--OuShiLouFang
- 該體系就有點臃腫,因爲當平房想要改成歐式時,還要建立子類。
- */
- 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
- 無論將平房打造成田園還是歐式,都是對平房一種裝修。
- 而該裝修也可以用樓房。
- 將現將該裝修定義好,需要把什麼房子進行改裝修,傳入即可。
- 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();
- }
- }