代理模式:为其它对象提供一种代理以便控制这个对象的访问
1.静态代理:我们自己静态定义的代理类
2.动态代理:通过程序动态生成代理类
(1)基于接口的动态代理:jdk动态代理
(2)基于类的动态代理:CGLIB
(1)接口(租房):是对象和他的代理共同的接口
(2)真实角色(房东):是实现抽象接口的类
(3)代理角色(中介):内部含有真实对象的引用,从而可以操作真实对象
//租房接口
public interface Rent {
public void rent();
}
//主人去实现租房接口
public class Host implements Rent {
@Override
public void rent() {
System.out.println("房东要出租房子");
}
}
//代理类
public class Proxy implements Rent{
private Host host;
//有参
public Proxy(Host host){
this.host=host;
}
@Override
public void rent() {
//代理直接掉host的方法 进行代理
host.rent();
seeHouse();
Money();
}
public void seeHouse(){
System.out.println("看房子");
}
public void Money(){
System.out.println("谈金钱");
}
}
//客户
public class Client {
public static void main(String[]args){
//需要把房东new出来
Host host = new Host();
//把房东拿给代理 让代理直接掉房东的方法
Proxy proxy = new Proxy(host);
proxy.rent();
}
}
1.优点:
业务类只需要关注业务逻辑本身,保证了业务类的重用性
2.缺点:
(1)代理类实现接口,接口增加一个方法,代理类也需要增加。增加了维护的复杂度
(2)静态代理中的代理类是针对某一个类去做代理的,那么假设一个系统中有100个Service,则需要创建100个代理类
同静态代理
public interface Subject {
void doSomething();
}
//真实对象
public class RealSubject implements Subject {
@Override
public void doSomething() {
System.out.println("RealSubject do something");
}
}
//代理类
public class JDKDynamicProxy implements InvocationHandler {
private Object target;
public JDKDynamicProxy(Object target) {
this.target = target;
}
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Do something before");
Object result = method.invoke(target, args);
System.out.println("Do something after");
return result;
}
}
//测试
public class Client {
public static void main(String[] args) {
// jdk动态代理测试
Subject subject = new JDKDynamicProxy(new RealSubject()).getProxy();
subject.doSomething();
}
}
原文:https://www.cnblogs.com/muacheng/p/13388034.html