什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道
被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被
代理的人能干活呀。
举例子:
比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理
类图如下
(1).静态代理
- 定义同一种类型的接口
- 定义同一种类型接口的实现
- 定义代理类
1.先定义一种类型的女人:
java
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.实现接口
java
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("潘金莲和男人开心约会");
}
}
3.定义代理类
java
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;
}
@Override
public void makeEyesWithMan() {
//实际做事的是代理类
this.kindWomen.makeEyesWithMan();
}
@Override
public void happyWithMan() {
//实际做事的是代理类
this.kindWomen.happyWithMan();
}
}
4.找到代理类进行调用
java
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)静态代理******************");
//西门庆找到王婆,然后王婆就作为代理,帮忙安排了和潘金莲的约会
WangPo wangPo = new WangPo();
//王婆默认的代理就是潘金莲
wangPo.makeEyesWithMan();
wangPo.happyWithMan();
//传参数执行
WangPo wangPo2 = new WangPo(new PanJinLian());
wangPo2.makeEyesWithMan();
wangPo2.happyWithMan();
System.out.println("(2)动态代理******************");
KindWomen kindWomen = (KindWomen)new ProxyFactory(new PanJinLian()).getProxyInstance();
System.out.println("生成的代理对象"+kindWomen.getClass());
kindWomen.makeEyesWithMan();
kindWomen.happyWithMan();
}
}
(2).动态代理
java
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 {
//维护一个目标对象 , Object
private Object target;
//构造器 , 对target 进行初始化
public ProxyFactory(Object target) {
this.target = target;
}
//动态生成一个代理对象
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("动态代理开始");
Object returnVal = method.invoke(target, args);//反射机制调用目标对象的方法
System.out.println("动态代理结束");
return returnVal;
}
});
}
}
执行结果如下: