含義:
為其他物件提供一種代理以控制對這個物件的訪問,在某些情況下,一個物件不適合或不能直接參考另一個物件,而代理物件可以在客戶端和目標物件之間起到中介作用,一個類代表另一個類的功能,這種型別的設計模式屬于結構型模式,
結構:

實作:
1)靜態代理模式
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 }
優點:可以做到在符合開閉原則的情況下對目標物件進行功能擴展
缺點:我們得為每一個服務都得創建代理類,作業量太大,不易管理,同時介面一旦發生改變,代理類也得相應修改,
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 }
優缺點:
優點:1、職責清晰2、高擴展性3、智能化
缺點:1、由于在客戶端和真實主體之間增加了代理物件,因此有些型別的代理模式可能會造成請求的處理速度變慢,
2、實作代理模式需要額外的作業,有些代理模式的實作非常復雜,
使用場景:
遠程代理、虛擬代理、Copy-on-Write代理、保護(Protect or Access)代理、Cache代理、防火墻(Firewall)代理、同步化(Synchronization)代理、智能參考(Smart Reference)代理
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/35329.html
標籤:設計模式
下一篇:設計模式之單例模式C#實作
