- 什么是代理。舉個(gè)例子,比如代理某個(gè)品牌,你在通過(guò)授權(quán)之后,出售他們的產(chǎn)品,在出售的過(guò)程中,你可以調(diào)整價(jià)格,開(kāi)展優(yōu)惠活動(dòng)。相當(dāng)于在原有的銷(xiāo)售流程上加上任何你想加的東西,甚至你都可以直接把他們的產(chǎn)品扔掉。
接下來(lái)就用具體的代碼來(lái)說(shuō)明。我們就以蘋(píng)果(Apple)的產(chǎn)品為例。
首先對(duì)蘋(píng)果的產(chǎn)品有一個(gè)統(tǒng)一的接口
public interface Apple {
void sell();//蘋(píng)果產(chǎn)品的出售方法
}
然后官方的iPhone X(請(qǐng)忽略首字母沒(méi)大寫(xiě))
public class iPhoneX implements Apple {
@Override
public void sell() {
System.out.println("The price is 8316 RMB");
}
}
現(xiàn)在我要代理這款產(chǎn)品,我要想一個(gè)代理方案。我決定在顧客買(mǎi)了我的iPhone X之后,送他們一副耳機(jī)。
//這是我的代理方案
public class iPhoneXProxyHandler implements InvocationHandler {
private iPhoneX x;
public iPhoneXProxyHandler(iPhoneX x) {
this.x = x;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(x, args);//按照原價(jià)賣(mài)給客戶
System.out.println("贈(zèng)送一副耳機(jī)");//這是額外的優(yōu)惠
return result;
}
}
public iPhoneX x = new iPhoneX();//這是從官方進(jìn)貨的iPhone X
public iPhoneXProxyHandler handler = new iPhoneXProxyHandler(x);//這是我的代理方案,代理上面的iPhone X
//獲得我代理的iPhone X
public iPhoneX iPhoneXProxy = (iPhoneX) Proxy.newProxyInstance(x.getClass().getClassLoader(), x.getClass().getInterfaces(), handler);
現(xiàn)在我已將官方的iPhone X作為了我的代理產(chǎn)品?,F(xiàn)在我要把它賣(mài)掉。
iPhoneXProxy.sell();
>The price is 8316 RMB
>贈(zèng)送一副耳機(jī)
好了,現(xiàn)在我已經(jīng)把我代理的產(chǎn)品買(mǎi)掉了?,F(xiàn)在我準(zhǔn)備代理蘋(píng)果的平板。
public class iPadPro implements Apple {
@Override
public void sell() {
System.out.println("The price is 5143 RMB");
}
}
然后我決定把所有的代理的平板都砸掉(我怕不是個(gè)傻子吧)
//這是我的砸產(chǎn)品的代理方案
public class DestroyProxyHandler implements InvocationHandler {
private Object obj;
public DestroyProxyHandler(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("被砸掉了");
return null;
}
}
public iPadPro ipad = new iPadPro();//這是從官方進(jìn)貨的iPad Pro
public DestroyProxyHandler handler = new DestroyProxyHandler(ipad);//這是我的代理方案,代理上面的iPad Pro
//獲得我代理的iPad Pro
public iPadPro iPadProProxy = (iPadPro) Proxy.newProxyInstance(ipad.getClass().getClassLoader(), ipad.getClass().getInterfaces(), handler);
然后。。。
iPadProProxy.sell();
>被砸掉了
結(jié)束!
其實(shí)可以聯(lián)系到Android Retrofit的注解請(qǐng)求方式和MyBatis的Mapper應(yīng)該都是使用動(dòng)態(tài)代理,只需要注解上的字段,所以不需要實(shí)現(xiàn)類(lèi)。