前言:好的UML图用visual paradigm
Java设计模式中的代理模式,在ibatis和spring AOP源码中都有用到,是解耦和的重要实现方式。
静态代理模式
下图是静态代理模式的UML图
静态代理模式可以理解为:Subject接口或者抽象类。代理类和其他的实现类去implement他。
需要实例化一个特定的实现类,用Subject这个超类接收作数据类型;
然后再实例化代理类,也是用Subject这个超类接收作数据类型;
最后将实例化好的实现类注入到(Setter)到代理类中。
这样代理类调用即可。
静态代理模式的实现方式
Subject 实现方式
public interface Subject {
public void doAction(String action);
}
ProxySubject 实现方式
public class ProxySubject implements Subject {
Subject realSubject;
//将subject的实现类注入到代理类中
public ProxySubject(Subject subject) {
super();
this.realSubject = subject;
}
@Override
public void doAction(String action) {
System.out.println("进入proxy ***的action方法");
realSubject.doAction(action);
System.out.println("结束proxy xxx的action方法");
}
}
RealSubject实现方式
public class RealSubject implements Subject{
@Override
public void doAction(String action) {
System.out.println("RealSubject doAction的action为: "+action);
}
}
Client 实现方式
public class Client {
public static void main(String[] args) {
Subject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.doAction("你看看");
}
}
打印输出结果
cglib和jdk代理的区别
cglib和jdk代理的意思是,原来的静态代理模式需要你自己去写代理类,然后再注入相关的代理类。
那么cglib和jdk来了以后,不需要你去实现这些代理类了,你只要把对应的注入相关的被代理的类就可以了。
jdk代理代理的是接口,也就是代理Subject那个类,然后注入RealSubject
而cglib代理的是RealSubject,原理是继承这个RealSubject类然后重写里面的方法,就是因为继承的方式,导致他不能代理final修饰的方法。
该文为笔记,如果您发现存在问题,不吝指出,谢谢!