含義:設計模式
爲其餘對象提供一種代理以控制對這個對象的訪問。在某些狀況下,一個對象不適合或不能直接引用另外一個對象,而代理對象能夠在客戶端和目標對象之間起到中介做用。一個類表明另外一個類的功能。這種類型的設計模式屬於結構型模式。this
結構:spa
實現:設計
1)靜態代理模式3d
1 服務類接口 2 // 建立服務類接口
3 public interface BuyHouse { 4 void buyHouse(); 5 } 6 實現服務類接口,顧客 7 // 實現服務接口,這個類是一個顧客類,想要購買房屋
8 public class Customer implements BuyHouse { 9 public void buyHouse() { 10 System.out.println("我要買房!"); 11 } 12 } 13 實現服務類接口,中介 14 // 建立代理類,這個類是一箇中介類,他負責爲顧客買房
15 public class Agency implements BuyHouse{ 16 private BuyHouse buy; 17 public Agency(final BuyHouse buy) { 18 this.buy = buy; 19 } 20 public void buyHouse() { 21 System.out.println("買房前準備"); 22 buy.buyHouse(); 23 System.out.println("買房後準備"); 24 } 25 }
優勢:能夠作到在符合開閉原則的狀況下對目標對象進行功能擴展代理
缺點:咱們得爲每個服務都得建立代理類,工做量太大,不易管理。同時接口一旦發生改變,代理類也得相應修改。code
2)動態代理模式對象
1 服務類接口 2 // 建立服務類接口
3 public interface BuyHouse { 4 void buyHouse(); 5 } 6 編寫動態處理器 7 public class DynamicProxy implements InvocationHandler{ 8 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 9 System.out.println("開始執行方法"); 10 if("toString".equals(method.getName())) { 11 return proxy.getClass().getName(); 12 }else if("buyHouse".equals(method.getName())) { 13 System.out.println("準備購買房屋"); 14 return proxy; 15 } 16 return null; 17 } 18 public static <T> T newInstance(Class<T> c) { 19 Class[] t = {c}; 20 Object obj = Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(), t, new DynamicProxy()); 21 return (T)obj; 22 } 23 }
優缺點:blog
優勢:一、職責清晰二、高擴展性三、智能化接口
缺點:一、因爲在客戶端和真實主體之間增長了代理對象,所以有些類型的代理模式可能會形成請求的處理速度變慢。
二、實現代理模式須要額外的工做,有些代理模式的實現很是複雜。
使用場景:
遠程代理、虛擬代理、Copy-on-Write代理、保護(Protect or Access)代理、Cache代理、防火牆(Firewall)代理、同步化(Synchronization)代理、智能引用(Smart Reference)代理