更新时间:2021-08-10 13:48:24 来源:极悦 浏览944次
动态代理设计模式:为所有功能一致的业务操作接口提供统一的代理处理操作
代理设计模式的核心是有真实业务实现类与代理业务实现类,代理类会完成比真实业务更多的处理逻辑。
传统代理设计模式的弊端:所有的代理设计模式如果按照设计要求来讲,必须是基于接口的设计。而静态代理设计的特点在于:一个代理类只为一个接口服务。这也是问题所在。
java提供的动态代理实现
//主体接口
interface ISubject{
public void eat(String food,int num);
}
//真实操作类
class Subject implements ISubject{
@Override
public void eat(String food, int num) {
System.out.println("吃了"+num+"份"+food);
}
}
//动态代理类[伪代理],想使用动态代理必须实现此接口
class ProxySubject implements InvocationHandler{
private Object target;
//动态代理绑定真实业务对象 返回动态代理对象
public Object bind(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
public void eatParpre(){
System.out.println("准备食物");
}
public void eatClear(){
System.out.println("吃完啦,刷盘子");
}
//Spring的Aop核心就是使用的动态代理
//method存储的是真实业务对象的方法对象[eat方法对象]
//args参数 此处应该是我传递的 "鸡腿", 20 看下图
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
this.eatParpre();
//使用反射调用核心业务方法
Object ret = method.invoke(target, args);
this.eatClear();
return ret;
}
}
public class ProxyTest {
public static void main(String[] args) {
//调用
ISubject subject = (ISubject)new ProxySubject().bind(new Subject());
//subject调用eat的时候会触发代理对象调用invoke方法,在invoke方法里使用反射调用真实业务方法
subject.eat("鸡腿", 20);
}
}
运行结果:
准备食物
吃了20份鸡腿
吃完啦,刷盘子
例子场景:打架
如:
桃花岛比武抢亲之战 —— 郭靖与欧阳克
华山论剑正邪之战 —— 北丐洪七公和西毒欧阳峰
小朋友梦想之战 —— 奥特曼与铠甲勇士
…
这些战斗之中,都要打架,但是打架之前需要有一些前期准备,打架(实战)工作由目标对象实现,而前期的准备(练功)工作则由代理对象实现。
以上就是极悦小编介绍的"动态代理设计模式",希望对大家有帮助,想了解更多可查看Java设计模式。极悦在线学习教程,针对没有任何Java基础的读者学习,让你从入门到精通,主要介绍了一些Java基础的核心知识,让同学们更好更方便的学习和了解Java编程,感兴趣的同学可以关注一下。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习