代理模式分为三部分
1.静态代理
1.抽象主题类
//抽象主题类
public interface SellTicket {
public void sell();
}
2.具体主题类
//具体主题类
public class TranStation implements SellTicket {
@Override
public void sell() {
System.out.println("火车站卖票");
}
}
3.代理类
//代理🥱
public class PointProxy implements SellTicket {
public static void main(String[] args) {
PointProxy pointProxy = new PointProxy();
pointProxy.sell();
}
private TranStation tranStation=new TranStation();
@Override
public void sell() {
System.out.println("代售点开始卖票");
tranStation.sell();
}
}
2.动态代理
使用Proxy.newProxyInstance()生成代理对象并实现加强方法
public class ProxyFactory {
public static void main(String[] args) {
ProxyFactory.sellTicket().sell();
}
private static TranStation tranStation=new TranStation();
public static SellTicket sellTicket(){
Object object = Proxy.newProxyInstance(tranStation.getClass().getClassLoader(), tranStation.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("这里是jdk代理类");
//执行被代理的方法
method.invoke(tranStation, args);
return null;
}
});
return (SellTicket)object;
}
}
动态代理类生成是在内存中
会调用proxy中invokecationhandler.invoke的方法也就是上main定义的子实现的方法
3.cglib动态代理
使用 TranStation tranStation = (TranStation) enhancer.create();底层使用asm生成代理对象
public class ProxyFactory implements MethodInterceptor {
TranStation tranStation=new TranStation();
public static void main(String[] args) {
ProxyFactory proxyFactory = new ProxyFactory();
TranStation proxyObject = proxyFactory.getProxyObject();
proxyObject.sell();
}
public TranStation getProxyObject(){
//创建enhancer类
Enhancer enhancer=new Enhancer();
//设置父类
enhancer.setSuperclass(TranStation.class);
//设置代理方法
enhancer.setCallback(this);
//创建代理对象
TranStation tranStation = (TranStation) enhancer.create();
return tranStation;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib加强");
method.invoke(tranStation,objects);
return null;
}
}
jdk1.8以后有接口的都用jdk动态代理没有的用cglib
代理模式的优点
1.保护目标对象的访问
2.降低了系统的耦合度
3.扩张了目标对象的功能
缺点
增加了代码的复杂度
1.远程代理
rpc思想远程调用方法
2.防火墙代理
vpn
3.保护代理
控制对一个对象的访问