简单的来说,设计模式就是前辈为了解决一些特定的问题而总结出来的一种实现方式
1:真实对象
2:代理对象
3:抽象对象
1:保护你的真实对象
2:让真实对象的职责更明确
3:方便你的代码进行扩展
1:静态代理实现
2:JDK动态实现
3:CGlib动态实现
其中两种动态的实现方法才是需要真正去理解的
定义一个抽象接口类()
代码如下(示例):
public interface a{
void eat();
}
//定义一个真实对象类实现抽象类方法
public class b implements a{
@Override
public void eat() {
System.out.println("吃");
}
}
//定义一个代理对象实现抽象接口类的方法
public class c implements a{
b zhenShi=new b();
@Override
public void chifan() {
//调用真实对象前执行的操作
System.out.println("。。。");
//2.调用真实对象的功能
zhenShi.eat();
//3.调用真实对象后执行的操作
System.out.println("....");
}
}
形象一点就是把代理对象当成为一个中间人,比方说一个人要租房,代理对象就是中介,真实对象就是房东,抽象对象就是你,你的功能就是租房,房东就是只负责租房给你功能,其余的剩下的比方看房什么的就全部交由中介来做。目的就是为了让真实对象的功能更加明确。
代码如下(示例):
//抽象功能
public interface a{
void eat();
}
//真实对象
public class b implements a{
@Override
public void eat() {
System.out.println("吃");
}
}
// 生成代理对象的处理器
// 生成代理对象,调用对应invoke方法
//编写jdk动态代理控制器类实现InvocationHandler接口
public class JdkProxyHandler implements InvocationHandler{
b bb=new b();
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("...");
//真实对象的方法
Object obj=method.invoke(bb, args);
System.out.println("...");
return obj;
}
}
jdk动态代理是基于java的反射机制实现的,运行效率基于Cglib来说较低,还是不推荐使用jdk来实现
代码如下(示例):
//真实目标对象
public class b{
public void eat() {
System.out.println("吃");
}
}
//cglib动态代理的控制器
@author meimei
public class CglibProxyHandler implements MethodInterceptor{
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("...");
Object obj=arg3.invokeSuper(arg0, arg2);
System.out.println("....");
return obj;
}
}
//测试类
public class Test {
public static void main(String[] args) {
//生成代理对象 是真实对象的子类
Enhancer enhancer=new Enhancer();
//设置目标对象,父类
enhancer.setSuperclass(b.class);
//设置调用动态代理控制器
enhancer.setCallback(new CglibProxyHandler());
b bb=(b)enhancer.create();
bb.eat();
}
}
![](https://s4.51cto.com/images/blog/202101/08/b4c0f19610461265699c4c8305ae2631.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
**用cglib时需要导入这个jar包**
目标对象不需要实现接口,生成的代理对象是真实对象的子类。
基于字节码实现,运行效率相对于jdk要高。
原文:https://blog.51cto.com/15079488/2585796