专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 动态代理设计模式

动态代理设计模式

更新时间:2021-08-10 13:48:24 来源:赢咖4 浏览869次

1.反射与代理设计模式

动态代理设计模式:为所有功能一致的业务操作接口提供统一的代理处理操作

代理设计模式的核心是有真实业务实现类与代理业务实现类,代理类会完成比真实业务更多的处理逻辑。

传统代理设计模式的弊端:所有的代理设计模式如果按照设计要求来讲,必须是基于接口的设计。而静态代理设计的特点在于:一个代理类只为一个接口服务。这也是问题所在。

2.动态代理类绑定真实对象

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份鸡腿
吃完啦,刷盘子

例子场景:打架

如:

桃花岛比武抢亲之战 —— 郭靖与欧阳克

华山论剑正邪之战 —— 北丐洪七公和西毒欧阳峰

小朋友梦想之战 —— 奥特曼与铠甲勇士

这些战斗之中,都要打架,但是打架之前需要有一些前期准备,打架(实战)工作由目标对象实现,而前期的准备(练功)工作则由代理对象实现。

以上就是赢咖4小编介绍的"动态代理设计模式",希望对大家有帮助,想了解更多可查看Java设计模式。赢咖4在线学习教程,针对没有任何Java基础的读者学习,让你从入门到精通,主要介绍了一些Java基础的核心知识,让同学们更好更方便的学习和了解Java编程,感兴趣的同学可以关注一下。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>