代理模式與裝飾者模式看起來很像,都實現基礎對象實現的接口,在其自身對象中都保存着對被代理/被裝飾者的對象引用。
先來看看裝飾者模式的定義:動態的將責任附加到被裝飾者對象上,用於擴展對象的功能。比繼承的靈活性大。典型的如Java IO的設計便是裝飾者模式的典型應用。
代理模式模式的定義:對其餘對象進行代理,以控制對被代理對象的訪問。Spring的爲業務邏輯層方法生成的代理類,主要進行一些事務控制等。
由定義能夠看出裝飾的責任是擴展功能 ,而代理主要控制訪問。java
繼承和裝飾者模式都是一種對基本功能的拓展,裝飾者模式比繼承更加的靈活。前提是被裝飾的類要實現了某個接口。設計模式
簡單實現ide
拿一開始說的那我的爲例子。人是個抽象的概念。男孩是個具體的人。可是這我的要幹不一樣的事情要穿不同的衣服,就須要進行不一樣的包裝。this
抽象的人:spa
public abstract class Person { public abstract void dress(); }
具體的人,也是原始的人,被裝飾者:設計
public class Boy extends Person { @Override public void dress() { System.out.println("穿內衣內褲"); } }
抽象的裝飾者:代理
public abstract class PersonDecorator { Person person; public PersonDecorator(Person person) { this.person = person; } public void dress(){ person.dress(); } }
工做人裝飾者:調試
public class WorkPersonDecorator extends PersonDecorator { public WorkPersonDecorator(Person person) { super(person); } @Override public void dress() { super.dress(); dressWork(); } private void dressWork(){ System.out.println("穿西裝領帶"); } }
運動的人裝飾者:code
public class SportPersonDecorator extends PersonDecorator { public SportPersonDecorator(Person person) { super(person); } @Override public void dress() { super.dress(); dressSport(); } private void dressSport(){ System.out.println("穿運動衣"); } }
客戶端調用:對象
public class Client { public static void main(String[] args) { Person boy = new Boy(); System.out.println("包裝一個上班人:"); WorkPersonDecorator workPersonDecorator = new WorkPersonDecorator(boy); workPersonDecorator.dress(); System.out.println("包裝一個運動的人:"); SportPersonDecorator sportPersonDecorator = new SportPersonDecorator(boy); sportPersonDecorator.dress(); } }
裝飾模式和前面的代理模式有點相似,容易把裝飾模式當作代理模式。裝飾模式是繼承的一種替代方案,主要爲所裝飾的對象加強功能,動態的增長方法。而代理模式主要是爲了控制對原有對象的訪問權限,不對原有對象進行功能加強。
我以爲二者的區別主要是使用目的的區別。
是繼承的一種替代方案,可是比繼承要靈活的多,能夠在運行時經過傳入不一樣的被裝飾器或不一樣的裝飾器來達成不一樣的行爲。 增長新的被裝飾類和裝飾類很方便,並且不用修改原有代碼。便於拓展。符合開閉原則。
設計模式基本都有這個缺點,就是會生成額外的類,增長系統複雜度。 因爲裝飾能夠層層包裝,交叉包裝,若是包裝的很深的話,調試排錯會比較麻煩,也不容易理解。