一、定義
為其他對象提供一種代理以控制對這個對象的訪問。
二、使用場景
當(dāng)無法或不想直接訪問某個對象,或訪問某個對象存在困難時,可以通過一個代理對象來間接訪問。
為了保證客戶端使用的透明性,被代理對象與代理對象需要實現(xiàn)相同的接口。
三、UML類圖

代理模式
Subject:抽象主題類,可以是抽象類或接口,聲明真實主題與代理的共同接口方法。
RealSubject:真實主題類,也稱為被代理類,該類定義了代理所代表的真實對象。
ProxySubject:代理類,該類持有一個真實主題對象的引用。
Client:客戶端。
四、實現(xiàn)
//抽象主題類
public abstract class Subject {
public abstract void visit();
}
//真實主題類
public class RealSubject extends Subject {
@Override
public void visit() {
System.out.println("Real subject");
}
}
//代理類
public class ProxySubject extends Subject {
private RealSubject mSubject;
public ProxySubject(RealSubject subject) {
mSubject = subject;
}
@Override
public void visit() {
mSubject.visit();
}
}
//客戶端
public class Client {
public static void main(String[] args) {
RealSubject real = new RealSubject();
ProxySubject proxy = new ProxySubject(real);
proxy.visit();
}
}
五、應(yīng)用
例子:第三方SDK,Bmob SDK
項目中需要使用Bmob SDK完成用戶注冊登錄功能,在Bmob SDK中用戶類為BmobUser,我們只需要在代碼中定義BmobUserBean extends BmobUser,就可以使用BmobUserBean類進行注冊登錄操作。
但是如果我們在代碼中直接使用BmobUserBean的話,整個項目就與Bmob SDK耦合較緊,如果以后想替換為其它SDK,需要修改的地方較多,這時就可以使用代理模式。
定義一個代理類BbdUserBean,里面持有被代理類BmobUserBean對象的引用,代理類與被代理類實現(xiàn)相同的接口IUser,然后在代碼中使用代理類BbdUserBean。如果以后想替換為其它SDK,只需要修改代理類里面持有的被代理類對象的引用即可。
六、總結(jié)
代理就是真實對象的代表。