?代理模式(Proxy Pattern)結(jié)構(gòu)型設(shè)計(jì)模式之一誊爹,提供了對(duì)目標(biāo)對(duì)象另外的訪問方式;即通過代理對(duì)象訪問目標(biāo)對(duì)象.這樣做的好處是:可以在目標(biāo)對(duì)象實(shí)現(xiàn)的基礎(chǔ)上,增強(qiáng)額外的功能操作,即擴(kuò)展目標(biāo)對(duì)象的功能.
代理模式中有如下角色:
- Subject:抽象主題類,申明真實(shí)主題類的抽象方法蝴簇。
- RealSubject:真實(shí)主題類佑刷,Subject的實(shí)現(xiàn)類谷誓。
- Proxy:代理類,持有真實(shí)主題類的引用昵宇。
- client:客戶端類矗愧,調(diào)用代理類。
一宽堆、靜態(tài)代理
?靜態(tài)代理在代理前就知道要代理誰腌紧,代理對(duì)象是明確的。
例子:找李幫我買東西
/** subject*/
public interface Shop{
void buy();
}
/** realSubject */
public class IShop implements Shop{
@Override
public void buy(){
System.out.print("我shop了");
}
}
/** Proxy*/
public class LiShop implements Shop{
private IShop iShop;
public LiShop(IShop iShop){
this.iShop = iShop;
}
@Override
public void buy(){
shopBicycle();
iShop.buy();
}
private void shopBicycle(){
System.out.print("LI買了自行車");
}
}
/** client */
public class Client{
public static void main(String[] args){
Shop shop = new LiShop(new IShop());
shop.buy();
}
}
二畜隶、動(dòng)態(tài)代理
? 動(dòng)態(tài)代理是在代碼運(yùn)行時(shí)壁肋,通過反射來動(dòng)態(tài)的生成代理類的對(duì)象,并確定到底代理誰籽慢,代理對(duì)象將在代碼運(yùn)行時(shí)決定浸遗。
/** proxy */
public class DynamicProxy{
private Object target;
public DynamicProcxy(Object target){
this.target= target;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("開始事務(wù)2");
//執(zhí)行目標(biāo)對(duì)象方法
Object returnValue = method.invoke(target, args);
System.out.println("提交事務(wù)2");
return returnValue;
}
}
);
}
}
/** client */
public class Client{
public static void main(String[] args) {
// 目標(biāo)對(duì)象
Shop target = new IShop();
// 【原始的類型 class cn.itcast.b_dynamic.IShop】
System.out.println(target.getClass());
// 給目標(biāo)對(duì)象,創(chuàng)建代理對(duì)象
Shop proxy = (Shop ) new ProxyFactory(target).getProxyInstance();
// class $Proxy0 內(nèi)存中動(dòng)態(tài)生成的代理對(duì)象
System.out.println(proxy.getClass());
// 執(zhí)行方法 【代理對(duì)象】
proxy.save();
}
}
注:代理模式與裝飾者模式十分相似箱亿,區(qū)別在于代理模式是對(duì)目標(biāo)對(duì)象的功能進(jìn)行擴(kuò)展(對(duì)單個(gè)方法的功能進(jìn)行擴(kuò)展)跛锌,而裝飾者模式是對(duì)目標(biāo)對(duì)象添加職責(zé)(添加可供調(diào)用的方法)。