代理模式
代理模式就是为目标对象提供一个代理对象,为了更好的保护和隐藏我们的目标对象,同时也为实施不同控制策略的时候留下空间,控制更具灵活性。
动态代理
java的动态代理可以动态的添加代理并且动态处理代理方法的调用,只需要指定一组接口和委托类对象,就能动态获取代理类。
原理
可以举个例子,就比如我要找我朋友出门,但是要先经过他父母的同意,这时候他父母就是代理,我要通过他们,才能得到目标类(朋友)的方法。朋友父母会问要去哪里或者去了哪里,这其实就是为实施不同控制策略留下的操作空间
示例代码
/**
* @author xuxi
* @date 2021/3/16
* @desciption
**/
public class MyFriend implements SomeMethods{
private String name;
private String id;
private int age;
private String sex;
public MyFriend() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public void play() {
System.out.println("我和xx出去玩了!!!!");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author xuxi
* @date 2021/3/16
* @desciption
**/
public class MyFriendParents implements InvocationHandler {
MyFriend myFriend;
public MyFriendParents(MyFriend myFriend) {
this.myFriend = myFriend;
}
/**
*proxy - 调用该方法的代理实例
*method -所述方法对应于调用代理实例上的接口方法的实例。 方法对象的声明类将*是该方法声明的接口,它可以是代理类继承该方法的代理接口的超级接口。
*args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法* *没有参数。 */
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//同学父母在放同学出去之前要问清楚去哪里玩了
System.out.println("你们俩要去哪里玩");
//同学可以和我出去玩了
Object o=method.invoke(myFriend,args);
//同学父母在同学回家后又问他还去了干了啥
System.out.println("你们俩之后又去哪里玩了");
return o;
}
}
import java.lang.reflect.Proxy;
/**
* @author xuxi
* @date 2021/3/16
* @desciption
**/
public class Me {
public static void main(String[] args) {
MyFriend myFriend=new MyFriend();
//我向同学父母请求放同学出门
MyFriendParents myFriendParents=new MyFriendParents(myFriend);
//获得到同意,同学可以出门了
SomeMethods canGoOut= (SomeMethods) Proxy.newProxyInstance(myFriend.getClass().getClassLoader(),myFriend.getClass().getInterfaces(),myFriendParents);
//可以和同学一起玩了
canGoOut.play();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7k49549-1615895213424)(D:\Typora\image-20210316194521150.png)]