设计模式——代理模式

1、代理模式
  为其他对象提供一种代理,并以控制对这个对象的访问。对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。
2、代理模式的角色
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理角色内部包含有真实对象的引用,从而可以操作真实对象。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
3、动态代理
  它是可以动态的创建代理并动态的处理对所代理方法的调用。是在运行生成的类,在生成时你必须提供一组Interface给它,然后该class就宣称它实现了这些interface。你可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
  在使用动态代理类时,我们必须实现InvocationHandler接口。
4、代理的两个类
(1)java.lang.reflect.Proxy
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类
(2)InvocationHandler
是代理实例的调用处理程序 实现的接口,每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
5、代码展示

//test类
public class Test {
    public static void main(String[] args){

        //通过Proxy.newProxyInstance构建代理对象
        RealSubject realSub = new RealSubject();
        InvocationHandler handler = new DynamicSubject(realSub);
        Class<?> classType = handler.getClass();

        Subject sub = (Subject) Proxy.newProxyInstance(classType.getClassLoader(), realSub.getClass().getInterfaces(), handler);
        System.out.println(sub.getClass());
        /*输出:class com.sun.proxy.$Proxy0 新建的代理对象,它实现指定的接口
         */

        //通过调用代理对象的方法去调用真实角色的方法。
        //调用真实角色RealSubject的Request()方法
        sub.Request();
        /* 输出:
        Method:public abstract void com.reflect.Proxy.Subject.Request(), Args:null
        test RealSubject
         */

    }
}

//代理角色
//包含真实角色的引用,从而可以操作真实角色
public class DynamicSubject implements InvocationHandler {

    private Object sub;
    public DynamicSubject(Object obj){
        this.sub = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Method:"+ method + ", Args:" + args);
        method.invoke(sub, args);//使用Method.invoke()方法将请求转发给被代理对象
        return null;
    }
}

//真实角色
//代理对象所代表的真实角色,最终为代理角色引用的对象
public class RealSubject implements Subject {
    @Override
    public void Request() {
        System.out.println("test RealSubject");
    }
}

//定义抽象角色
//声明真实角色和抽象角色的接口
public interface Subject {
    public void Request();
}
利用 TensorFlow 训练自己的目标识别器。本文内容来自于我的毕业设计,基于 TensorFlow 1.15.0,其他 TensorFlow 版本运行可能存在问题。.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值