
(1).靜態(tài)代理
- 定義同一種類型的接口
- 定義同一種類型接口的實(shí)現(xiàn)
- 定義代理類
?1.先定義一種類型的女人:
package proxy;
/**
* * 定義一種類型的女人,王婆和潘金蓮都屬于這個(gè)類型的女人
*
* @author 1
* @version 1.0
* @description: TODO
* @date 2023/8/14 14:43
*/
public interface KindWomen {
/**
* 拋媚眼
*/
public void makeEyesWithMan();
/**
* 開心約會(huì)
*/
public void happyWithMan();
}
2.實(shí)現(xiàn)接口
package proxy;
/**
* 潘金蓮
*
* @author 1
* @version 1.0
* @description: TODO
* @date 2023/8/14 14:45
*/
public class PanJinLian implements KindWomen {
@Override
public void makeEyesWithMan() {
System.out.println("潘金蓮拋媚眼");
}
@Override
public void happyWithMan() {
System.out.println("潘金蓮和男人開心約會(huì)");
}
}
3.定義代理類
package proxy;
/**
* 代理類
* 王婆(幫忙給西門慶代理)
*
* @author 1
* @version 1.0
* @description: TODO
* @date 2023/8/14 14:46
*/
public class WangPo implements KindWomen {
private KindWomen kindWomen;
/**
* 王婆默認(rèn)就是潘金蓮的代理
*/
public WangPo() {
this.kindWomen = new PanJinLian();
}
/**
* 王婆可以代理這個(gè)類型的所有人
*
* @param kindWomen
*/
public WangPo(KindWomen kindWomen) {
this.kindWomen = kindWomen;
}
@Override
public void makeEyesWithMan() {
//實(shí)際做事的是代理類
this.kindWomen.makeEyesWithMan();
}
@Override
public void happyWithMan() {
//實(shí)際做事的是代理類
this.kindWomen.happyWithMan();
}
}
4.找到代理類進(jìn)行調(diào)用
package proxy;
/**
* 西門慶
*
* @author 1
* @version 1.0
* @description: TODO
* @date 2023/8/14 14:50
*/
public class XiMenQing {
public static void main(String[] args) {
System.out.println("(1)靜態(tài)代理******************");
//西門慶找到王婆,然后王婆就作為代理,幫忙安排了和潘金蓮的約會(huì)
WangPo wangPo = new WangPo();
//王婆默認(rèn)的代理就是潘金蓮
wangPo.makeEyesWithMan();
wangPo.happyWithMan();
//傳參數(shù)執(zhí)行
WangPo wangPo2 = new WangPo(new PanJinLian());
wangPo2.makeEyesWithMan();
wangPo2.happyWithMan();
System.out.println("(2)動(dòng)態(tài)代理******************");
KindWomen kindWomen = (KindWomen)new ProxyFactory(new PanJinLian()).getProxyInstance();
System.out.println("生成的代理對(duì)象"+kindWomen.getClass());
kindWomen.makeEyesWithMan();
kindWomen.happyWithMan();
}
}
(2).動(dòng)態(tài)代理
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author 1
* @version 1.0
* @description: TODO
* @date 2023/8/14 14:58
*/
public class ProxyFactory {
//維護(hù)一個(gè)目標(biāo)對(duì)象 , Object
private Object target;
//構(gòu)造器 , 對(duì)target 進(jìn)行初始化
public ProxyFactory(Object target) {
this.target = target;
}
//動(dòng)態(tài)生成一個(gè)代理對(duì)象
public Object getProxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() { //匿名類重寫invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("動(dòng)態(tài)代理開始");
Object returnVal = method.invoke(target, args);//反射機(jī)制調(diào)用目標(biāo)對(duì)象的方法
System.out.println("動(dòng)態(tài)代理結(jié)束");
return returnVal;
}
});
}
}
執(zhí)行結(jié)果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-652040.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-652040.html
到了這里,關(guān)于代理模式【Proxy Pattern】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!