我對代理模式的理解
阿新 • • 發佈:2019-01-22
我在學校迎新晚會上見到一個跳舞的女生,第一眼就想把她佔為己有,可是我與她素不相識,只能找其他同學偷偷要來她的聯絡方式。這就是代理模式
概念
我們來看一下head first設計模式裡是怎麼定義代理模式的:代理模式為另一個物件提供一個替身或佔位符以控制這個物件的訪問。使用代理模式建立代表物件,讓代表物件控制某物件的訪問,被代理的物件可以是遠端的物件、建立開銷大的物件或需要安全控制的物件。
如何實現
拿我追女生的例子來說,我就是委託物件,那個認識她的同學就是代理,我讓他去幫我要電話,本質上是我在要電話,最後的結果也是我要到了電話,而事實上卻是他找她要的電話。對於代理模式的呼叫者來說,是我在要電話而並不關注要電話的那個代理,這裡大家肯定覺得很熟悉,沒錯,我們採用了面向介面程式設計的思想,呼叫者只需要使用介面中的方法,不用在乎具體的實現類。
因此,我們可以先建立一個委託介面,介面中有一個要電話的抽象方法。然後寫一個‘我’物件繼承自這個介面,實現要電話的方法;再寫一個代理類同樣實現這個委託介面,在這個代理類中注入‘我’的例項,呼叫‘我’中的方法去實現介面方法。總結為一張圖:
程式碼實現
定義委託介面
public interface Subject{
void getCall();
}
定義‘我’
public class Me implements Subject{
@Override
public void getCall() {
// TODO Auto-generated method stub
System.out.println("我想要你的電話");
}
}
定義代理
public class Proxy implements Subject{
private Subject subject;
public Proxy(Subject subject) {
// TODO Auto-generated constructor stub
this.subject = subject;
}
@Override
public void getCall() {
// TODO Auto-generated method stub
subject.getCall();
}
}
測試
public class ProxyTest {
public static void main(String[] args) {
Me me = new Me();
Subject proxy = new Proxy(me);
proxy.getCall();
}
}
輸出結果: