代理模式

含義:設計模式

  爲其餘對象提供一種代理以控制對這個對象的訪問。在某些狀況下,一個對象不適合或不能直接引用另外一個對象,而代理對象能夠在客戶端和目標對象之間起到中介做用。一個類表明另外一個類的功能。這種類型的設計模式屬於結構型模式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)代理

相關文章
相關標籤/搜索