代理模式
定义:代理模式就是指为其他对象提供一种代理,来控制对这个对象的访问,相当于在客户端和目标对象之
间起到一个中介的作用。比如 婚介公司,快递员,房产中介...
什么时候用到代理模式?代理模式的功能
1.保护目标对象
2.增强目标对象
静态代理
先看代码
//定义接口
public interface IPerson {
void findHouse();
}
//被代理类
public class ZhangSan implements IPerson {
@Override
public void findHouse() {
System.out.println("朝阳,空间大,价格便宜...");
}
}
//代理类
public class StaticZhangSan implements IPerson {
private IPerson iPerson;
public StaticZhangSan(IPerson iPerson) {
this.iPerson = iPerson;
}
@Override
public void findHouse() {
System.out.println("缴纳定金...");
iPerson.findHouse();
System.out.println("找到满意的房子...");
}
}
//测试类
public class StaticTest {
public static void main(String[] args) {
//创建代理对象
IPerson person = new StaticZhangSan(new ZhangSan());
//执行代理对像的方法
person.findHouse();
}
}
有以上代码可以看出,静态代理优点和缺点
静态代理类 实现和目标代理类一样的接口,实现一样的方法。代理类的构造方法传入参数代理类
在代理类的方法中调用被代理类的方法。在调用前后植入代码。从而增强被代理类的功能。
动态代理
//接口
public interface IPerson {
void findHouse();
}
//被代理类
public class ZhangSan implements IPerson {
@Override
public void findHouse() {
System.out.println("朝阳,空间大,价格便宜...");
}
}
//jdk动态代理类
public class JdkMedium implements InvocationHandler {
private IPerson target;
public IPerson getInstance(IPerson target) {
this.target = target;
IPerson person = (IPerson) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return person;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(this.target, args);
after();
return result;
}
private void after() {
System.out.println("找到满意的房子...");
}
private void before() {
System.out.println("缴纳定金...");
}
}
//测试类
public class Test {
public static void main(String[] args) {
JdkMedium jdkMedium = new JdkMedium();
IPerson instance = jdkMedium.getInstance(new ZhangSan());
instance.findHouse();
}
}
动态代理:便于扩展,被代理类增加方法,而无需修改代理类。
jdk 动态代理: 需要代理类必须要实现一个接口。
cglib动态代理:无需实现接口,而是代理类直接继承被代理类。