我在學校迎新晚會上見到一個跳舞的女生,第一眼就想把她占為己有瓢对,可是我與她素不相識,只能找其他同學偷偷要來她的聯(lián)系方式。這就是代理模式
概念
我們來看一下head first設計模式里是怎么定義代理模式的:代理模式為另一個對象提供一個替身或占位符以控制這個對象的訪問姜盈。使用代理模式創(chuàng)建代表對象,讓代表對象控制某對象的訪問配阵,被代理的對象可以是遠程的對象馏颂、創(chuàng)建開銷大的對象或需要安全控制的對象示血。
如何實現(xiàn)
拿我追女生的例子來說,我就是委托對象救拉,那個認識她的同學就是代理难审,我讓他去幫我要電話,本質上是我在要電話亿絮,最后的結果也是我要到了電話告喊,而事實上卻是他找她要的電話。對于代理模式的調用者來說派昧,是我在要電話而并不關注要電話的那個代理黔姜,這里大家肯定覺得很熟悉,沒錯蒂萎,我們采用了面向接口編程的思想地淀,調用者只需要使用接口中的方法,不用在乎具體的實現(xiàn)類岖是。
因此帮毁,我們可以先創(chuàng)建一個委托接口,接口中有一個要電話的抽象方法豺撑。然后寫一個‘我’對象繼承自這個接口烈疚,實現(xiàn)要電話的方法;再寫一個代理類同樣實現(xiàn)這個委托接口聪轿,在這個代理類中注入‘我’的實例爷肝,調用‘我’中的方法去實現(xiàn)接口方法〉婆祝總結為一張圖:
代碼實現(xiàn)
定義委托接口
public interface Subject{
void getCall();
}
定義‘我’
public class Me implements Subject{
@Override
public void getCall() {
System.out.println("我想要你的電話");
}
}
定義代理
public class Proxy implements Subject{
private Subject subject;
public Proxy(Subject subject) {
this.subject = subject;
}
@Override
public void getCall() {
subject.getCall();
}
}
測試
public class ProxyTest {
public static void main(String[] args) {
Me me = new Me();
Subject proxy = new Proxy(me);
proxy.getCall();
}
}
輸出結果:
代理模式的好處
代理模式的優(yōu)勢在于當你需要添加或修改新的業(yè)務功能 ,不需要修改原來的代碼音瓷,即上述代碼中的Me
類对嚼,而是通過添加新的類來代理之前的邏輯,這也是所有設計模式的基本原則:可以加绳慎,不能改纵竖。