工作室網(wǎng)站建設方案模板seo國外英文論壇
什么是代理模式呢?我很忙,忙的沒空理你,那你要找我呢就先找我的代理人吧,那代理人總要知道
被代理人能做哪些事情不能做哪些事情吧,那就是兩個人具備同一個接口,代理人雖然不能干活,但是被
代理的人能干活呀。
舉例子:
比如西門慶找潘金蓮,那潘金蓮不好意思答復呀,咋辦,找那個王婆做代理
類圖如下

(1).靜態(tài)代理
- 定義同一種類型的接口
- 定義同一種類型接口的實現(xiàn)
- 定義代理類
?1.先定義一種類型的女人:
package proxy;/*** * 定義一種類型的女人,王婆和潘金蓮都屬于這個類型的女人** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:43*/
public interface KindWomen {/*** 拋媚眼*/public void makeEyesWithMan();/*** 開心約會*/public void happyWithMan();}
2.實現(xiàn)接口
package proxy;/*** 潘金蓮** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:45*/
public class PanJinLian implements KindWomen {@Overridepublic void makeEyesWithMan() {System.out.println("潘金蓮拋媚眼");}@Overridepublic void happyWithMan() {System.out.println("潘金蓮和男人開心約會");}
}
3.定義代理類
package proxy;/*** 代理類* 王婆(幫忙給西門慶代理)** @author 1* @version 1.0* @description: TODO* @date 2023/8/14 14:46*/
public class WangPo implements KindWomen {private KindWomen kindWomen;/*** 王婆默認就是潘金蓮的代理*/public WangPo() {this.kindWomen = new PanJinLian();}/*** 王婆可以代理這個類型的所有人** @param kindWomen*/public WangPo(KindWomen kindWomen) {this.kindWomen = kindWomen;}@Overridepublic void makeEyesWithMan() {//實際做事的是代理類this.kindWomen.makeEyesWithMan();}@Overridepublic void happyWithMan() {//實際做事的是代理類this.kindWomen.happyWithMan();}
}
4.找到代理類進行調(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)代理******************");//西門慶找到王婆,然后王婆就作為代理,幫忙安排了和潘金蓮的約會WangPo wangPo = new WangPo();//王婆默認的代理就是潘金蓮wangPo.makeEyesWithMan();wangPo.happyWithMan();//傳參數(shù)執(zhí)行WangPo wangPo2 = new WangPo(new PanJinLian());wangPo2.makeEyesWithMan();wangPo2.happyWithMan();System.out.println("(2)動態(tài)代理******************");KindWomen kindWomen = (KindWomen)new ProxyFactory(new PanJinLian()).getProxyInstance();System.out.println("生成的代理對象"+kindWomen.getClass());kindWomen.makeEyesWithMan();kindWomen.happyWithMan();}
}
(2).動態(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 {//維護一個目標對象 , Objectprivate Object target;//構造器 , 對target 進行初始化public ProxyFactory(Object target) {this.target = target;}//動態(tài)生成一個代理對象public Object getProxyInstance() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() { //匿名類重寫invoke方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("動態(tài)代理開始");Object returnVal = method.invoke(target, args);//反射機制調(diào)用目標對象的方法System.out.println("動態(tài)代理結束");return returnVal;}});}
}
執(zhí)行結果如下: