代理模式【介绍、静态代理、动态代理、入门、应用】

代理介绍

代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。

可以做到在不修改目标对象的功能前提下,对目标对象功能扩展。

这里写图片描述

简单理解代理

很简单举个例子:

  • 现在我是一个明星,拥有很多粉丝。粉丝希望我唱歌给他们听,但是如果都是我来接应他们,我岂不是很忙….于是乎,我就去找了个经纪人。这个经纪人就代表了我。当粉丝想要我唱歌的时候,应该是找经纪人,告诉经纪人想让我唱歌。

  • 现在我越来越红了,不是粉丝想要我唱歌,我就唱了。我要收费了。但是呢,作为一个公众人物,不可能是我自己说:我要收10000万,我才会去唱歌。于是这就让经纪人对粉丝说:只有10000万,我才会唱歌。

  • 无论外界是想要我干什么,都要经过我的经纪人。我的经纪人也会在其中考虑收费、推脱它们的请求。

经纪人就是代理,实际上台唱歌、表演的还是我

静态代理

直接使用例子来说明吧…现在我有一个IUserDao的接口,拥有save方法()


// 接口
public interface IUserDao {

    void save();
}
  • UserDao实现该接口,重写save()方法


public class UserDao implements IUserDao{

    @Override
    public void save() {
        System.out.println("-----已经保存数据!!!------");
    }

}

现在,我想要在save()方法保存数据前开启事务、保存数据之后关闭事务…(当然啦,直接再上面写不就行了吗…业务方法少的时候,确实没毛病…)


    public void save() {

        System.out.println("开启事务");
        System.out.println("-----已经保存数据!!!------");

        System.out.println("关闭事务");
    }

但是呢,现在如果我有好多好多个业务方法都需要开启事务、关闭事务呢?



    public void save() {

        System.out.println("开启事务");
        System.out.println("-----已经保存数据!!!------");

        System.out.println("关闭事务");
    }
    public void delete() {

        System.out.println("开启事务");
        System.out.println("-----已经保存数据!!!------");

        System.out.println("关闭事务");
    }
    public void update() {

        System.out.println("开启事务");
        System.out.println("-----已经保存数据!!!------");

        System.out.println("关闭事务");
    }
    public void login() {

        System.out.println("开启事务");
        System.out.println("-----已经保存数据!!!------");

        System.out.println("关闭事务");
    }

…..我们发现就有了很多很多的重复代码了…我们要做的就是:当用户调用UserDao方法的时候,找的是代理对象、而代理帮我在解决这么繁琐的代码

于是呢,我们就请了一个代理了

  • 这个代理要和userDao有相同的方法…没有相同的方法的话,用户怎么调用啊??
  • 代理只是对userDao进行增强,真正做事的还是userDao..

因此,我们的代理就要实现IUserDao接口,这样的话,代理就跟userDao有相同的方法了。


public class UserDaoProxy implements IUserDao{

    // 接收保存目标对象【真正做事的还是UserDao】,因此需要维护userDao的引用
    private IUserDao target;
    public UserDaoProxy(IUserDao target) {
        this.target = target;
    }

    @Override
    public void save() {
        System.out.println("开始事务...");

        target.save();          // 执行目标对象的方法

        System.out.println("提交事务...");
    }
}

外界并不是直接去找UserDao,而是要通过代理才能找到userDao


    public static void main(String[] args) {
        // 目标对象
        IUserDao target = new UserDao();

        // 代理
        IUserDao proxy = new UserDaoProxy(target);
        proxy.save();  // 执行的是,代理的方法
    }

这样一来,我们在UserDao中就不用写那么傻逼的代码了…傻逼的事情都交给代理去干了…

为什么要用动态代理?

我们首先来看一下静态代理的不足:

  • 如果接口改了,代理的也要跟着改,很烦!
  • 因为代理对象,需要与目标对象实现一样的接口。所以会有很多代理类,类太多。

动态代理比静态代理好的地方:

  • 代理对象,不需要实现接口【就不会有太多的代理类了】
  • 代理对象的生成,是利用JDKAPI, 动态地在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型;)

动态代理快速入门

Java提供了一个Proxy类,调用它的newInstance方法可以生成某个对象的代理对象,该方法需要三个参数:

这里写图片描述

  • 参数一:生成代理对象使用哪个类装载器【一般我们使用的是代理类的装载器】
  • 参数二:生成哪个对象的代理对象,通过接口指定【指定要代理类的接口】
  • 参数三:生成的代理对象的方法里干什么事【实现handler接口,我们想怎么实现就怎么实现】

在编写动态代理之前,要明确两个概念:

  • 代理对象拥有目标对象相同的方法【因为参数二指定了对象的接口】
  • 用户调用代理对象的什么方法,都是在调用处理器的invoke方法。
  • 使用JDK动态代理必须要有接口【参数二需要接口】

对象

小明是一个明星,拥有唱歌和跳舞的方法。实现了人的接口


public class XiaoMing implements Person {

    @Override
    public void sing(String name) {

        System.out.println("小明唱" + name);
    }

    @Override
    public void dance(String name) {

        System.out.println("小明跳" + name);

    }
}

接口

public interface Person {
    void sing(String name);

    void dance(String name);
}

代理类


public class XiaoMingProxy {

    //代理只是一个中介,实际干活的还是小明,于是需要在代理类上维护小明这个变量
    XiaoMing xiaoMing = new XiaoMing();


    //返回代理对象
    public Person getProxy() {

        /**
         * 参数一:代理类的类加载器
         * 参数二:被代理对象的接口
         * 参数三:InvocationHandler实现类
         */
        return (Person)Proxy.newProxyInstance(XiaoMingProxy.class.getClassLoader(), xiaoMing.getClass().getInterfaces(), new InvocationHandler() {

            /**
             * proxy : 把代理对象自己传递进来
             * method:把代理对象当前调用的方法传递进来
             * args:把方法参数传递进来
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                //如果别人想要让小明唱歌
                if (method.getName().equals("sing")) {

                    System.out.println("给1000万来再唱");

                    //实际上唱歌的还是小明
                    method.invoke(xiaoMing, args);
                }
                return null;
            }
        });

    }
}

测试类


    public static void main(String[] args) {

        //外界通过代理才能让小明唱歌
        XiaoMingProxy xiaoMingProxy = new XiaoMingProxy();
        Person proxy = xiaoMingProxy.getProxy();


        proxy.sing("我爱你");

    }


动态代理应用

我们之前写中文过滤器的时候,需要使用包装设计模式来设计一个request类。如果不是Servlet提供了实现类给我们,我们使用包装设计模式会出现麻烦

现在我们学习了动态代理了,动态代理就是拦截直接访问对象,可以给对象进行增强的一项技能

中文过滤器


    public void doFilter(final ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        final HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");


        //放出去的是代理对象
        chain.doFilter((ServletRequest) Proxy.newProxyInstance(CharacterEncodingFilter.class.getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                //判断是不是getParameter方法
                if (!method.getName().equals("getParameter")) {

                    //不是就使用request调用
                   return method.invoke(request, args);
                }

                //判断是否是get类型的
                if (!request.getMethod().equalsIgnoreCase("get")) {
                   return method.invoke(request, args);
                }

                //执行到这里,只能是get类型的getParameter方法了。
                String value = (String) method.invoke(request, args);
                if (value == null) {
                    return null;
                }
                return new String(value.getBytes("ISO8859-1"), "UTF-8");
            }

        }), response);

    }
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
一文了解代理模式、动态代理、静态代理 什么是代理模式原来的访问关系:代理模式的作用:代理的分类什么是静态代理静态代理流程静态代理的实现实现步骤定义业务接口 目标类实现接口 代理类实现功能 测试 静态代理实现步骤:代理功能改造 静态代理的缺陷代理复杂,难于管理代理类依赖目标类,代理类过多动态代理JDK动态代理InvocationHandler接口Method 类Proxy类实现步骤CGLib(Code Generation Library)动态代理 CGLib动态代理的特点 CGLib实现的步骤代理模式是指,为其他对象提供一种代理以控制对这个.. 阅读详情

相关推荐

Spring代理模式——静态代理和动态代理

代理模式 1、静态代理 2、动态代理

不迁怒,不贰过。小知识,大智慧。 2501

静态代理和动态代理的区别,使用场景是什么

代理模式 (1)什么是代理? 代理是一种常用的设计模式,主要作用是为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以再客户端和目标对象之间起到中介的作用. (2)什么时候使用代理? 设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的diamante,里面代码逻辑让人摸不到头脑,这是就会很难...

weixin_43666051的博客 3008

地理空间坐标系统-不同椭球基准间的坐标转换

基于同一个椭球基准,可以构建三类地理空间坐标系:大地球面坐标系、大地空间直角坐标系、大地投影坐标系。由于坐标原点和椭球长短半径等都相同,这三类坐标系之间可以通过无损的数学方法相互之间进行转换。那么现在问题来了,不同椭球基准(在全球范围来看存在成百上千的椭球基准)之间的坐标怎么转换?比如,北京54、西安80、国家2000,特别是在我国,现在主推国家2000坐标系,那么如何将历史的测绘成果(北京54和...

技术改变世界 8336

静态代理模式用法及应用场景

静态代理模式 概念:为其他对象提供一种代理以控制对这个对象的访问。 代理模式(Proxy)结构图 ——————图片选自大话设计 代码实现: 创建送礼物接口: /** * @ author 黄栋 * @ create 2021/10/20 */ public interface IGiveGift { //送洋娃娃 void giveDolls(); //送鲜花 void giveFlowers(); //送巧克力 void giveChocolate(

huangdongzlx的博客 823

【python快速编程入门(第二版)黑马程序员课后编程题】

python快速编程入门(第二版)黑马程序员课后编程题

weixin_46167259的博客 1万+

Welch 方法详解:一种经典而实用的功率谱密度估计方法

在信号处理领域,谱分析是用于分析信号频率内容的强大工具。Welch方法是现代谱分析中一种广泛使用的功率谱密度估计技术,由Peter D. Welch在1967年提出。它通过对信号进行分段、加窗和平均化处理,提供了一种平滑且稳定的频谱估计方法。Welch方法通过将信号分成多个重叠的段,每段应用窗函数,然后计算每段的周期图,最后对所有周期图进行平均化,得到平滑的功率谱密度估计。welch_psd函数接收信号x、采样频率fs、每段的样本数N、重叠样本数overlap和窗函数类型window。

DuHz的博客 7053

静态代理与动态代理及使用场景(个人笔记)

一、代理是什么 如果你要办婚宴,会有很多事务,挑选场地,布置场地,定制菜单......这些都是可以请婚庆公司代劳的事务,此时婚庆公司是代理对象,你是委托对象。你只要在婚宴上做重要的事务就行了-->入洞房 代理的好处是可以减少关键类中的冗余代码,增强可读性。 在代码中,通常我们会将重复的代码封装起来,但是遇到这类的代码-->我们想为每一个方法设置性能监测,得到方法执行的时间(此处睡眠500毫秒模拟): 这样的重复...

weixin_48319056的博客 1547

LeGO-LOAM相对LOAM的改进---地面分离的方法-算法原理+代码讲解

实际上此种地⾯分离算法有⼀些简单,我们可以结合激光雷达安装⾼度等其他先验信息进⾏优化,避免将桌子这些当作地面点。LeGO-LOAM中前端改进中很重要的⼀点就是充分利⽤了地⾯点,那⾸先⾃然是提取对地⾯点的提取。理想情况下, 应该接近0,考虑到⼀⽅⾯激光雷达安装也⽆法做到绝对⽔平,另⼀⽅⾯,地⾯也不是绝。对⽔平,因此,这个⾓度会略微⼤于0,考虑到作者实际在草坪之类的场景下运动,因此这个值被设置成。如上图,相邻的两个扫描线束的同⼀列打在地⾯上如AB点所⽰,他们的垂直⾼度差。,计算垂直⾼度差和⽔平⾼度差的⾓度。..

zysss_的博客 775

详解java动态代理机制以及使用场景(一)

说起java动态代理,在我刚开始学java时对这项技术也是十分困惑,明明可以直接调通的对象方法为什么还要使用动态代理?随着学习的不断深入和工作经验的积累,慢慢的体会并理解了java动态代理机制。昨天再给公司新同事做技术培训时有同学就对动态代理产生了疑问,我这里梳理一遍一并记录一下,方便大家查看对自己也是加深记忆。

远方和诗 的博客 6万+

OSG三维渲染引擎编程学习之一百:“第十一章:OSG粒子” 之 “11.1 粒子的主要模块”

OSG;三维渲染引擎编程学习;第十一章:OSG粒子;11.1 粒子的主要模块

LuckyHanMo的博客 799

Midscene.js(3):手把手教你用 YAML 脚本实现 AI 驱动的 Web UI 自动化「喂饭教程」

Midscene.js是一款开源的AI驱动UI自动化工具,通过自然语言描述即可控制浏览器或Android设备执行操作。它支持YAML脚本编写测试用例,降低了自动化测试门槛。

blues_C的博客 3241

Java的三种代理模式

Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接...

weixin_34121282的博客 1693

基于SOLIDWORKS API的工业级插件开发指南

SOLIDWORKS API是基于COM技术的一套开发接口,支持C#、VB.NET等语言,用于自动化建模、属性管理、界面定制等功能。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 2749

Java代理模式快速解析:从静态代理到动态代理

本文深入探讨了代理模式的核心概念、类型划分(静态代理与动态代理)及其典型应用场景,并通过代码示例详细演示了不同实现方式。静态代理以编译时绑定的方式增强功能,而动态代理则通过运行时生成实现高灵活性,特别适用于复杂多变的需求。文章还结合实际案例,展示了代理模式在日志记录、权限控制和分布式系统中的广泛应用,帮助读者全面掌握该模式的理论与实践。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 169万+

GibbsCAM软件二次开发:GibbsCAM软件API接口详解

API(Application Programming Interface,应用程序编程接口)是一种允许不同软件之间进行通信的接口。在GibbsCAM软件中,API提供了与外部程序交互的能力,使得开发者可以利用GibbsCAM的强大功能进行二次开发,定制化满足特定的制造需求。GibbsCAM的API主要基于.NET框架,使用C#或VB.NET等语言进行编程。在GibbsCAM软件中,通过API接口创建自定义几何形状是实现复杂零件设计和加工策略定制的关键步骤。

kkchenjj的博客 1497

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

代理模式:一文彻底搞懂静态代理和动态代理

代理模式(Proxy Pattern)是一种结构型设计模式,它的概念很简单,它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个角色:代理角色和真实角色。代理类负责代理真实类,为真实类提供控制访问的功能,真实类则完成具体的业务逻辑。这样,当我们不方便或者不能直接访问真实对象时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。代理模式的原理是将真实类的功能封装在代理类中,最基本的方式就是创建一个代理类,代理类实现和真实类相同的接口,并且在代理类中引用真

qq_36756227的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java静态代理和动态代理(代理模式)详解

1、代理模式 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。 代理模式有静态代理和动态代理两种实现方式。 2、静态代理 静态代理中,我们对目标对象的每个方法的增强都是手动完成的(后面会具体演示代码),非常不灵活(比如接口一旦新增加方法,目标对象和代理

_Hihi_的博客 3844

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【代理模式】Java的静态代理与动态代理

代理模式 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。通俗的来讲代理模式就是我们生活中常见的中介。 java为我们提供了基于接口的动态代理。介绍动态代理之前我们先说一下静态代理 1.静态代理 创建一个接口,然后创建一个被代理的类实现接口中的抽象方法,再创建一个代理类,让代理类也实现这个接口,在代理类里创建一个被代理的类,在调用被代理

王德昌的博客 1万+

静态代理和动态代理

代理模式是一种结构型设计模式,它为目标对象提供一种代理,用来控制对目标对象的访问。代理对象在客户端和目标对象之间起到中介的作用。客户端通过代理对象间接地访问目标对象,而不需要直接与目标对象进行交互。可以在不改变目标对象内容的前提下,通过代理对象扩展目标对象的行为逻辑;根据代理创建的时期静态代理:以硬编码的方式,手动定义创建的代理类;动态代理:代理类是在运行时动态创建的,在DK的核心类库中,可以使用 Java.lang.reflect.Proxy 类和接来生成动态代理;代理模式的应用场景。

weixin_71072718的博客 2640

基于代理模式:深入了解静态代理和动态代理

代理模式是设计模式中结构型模式通过一个 “代理对象” 来间接访问 “目标对象”,并在访问前后添加额外操作,从而实现对目标对象的控制或功能增强。今天我们从代理模式开始了解,基于代理模式去深入了解静态代理模式和动态代理模式。// 抽象主题:定义用户服务的接口// 添加用户// 删除用户总的来说,代理模式通过 “代理对象” 实现对 “目标对象” 的间接访问,核心价值是控制访问 + 功能增强。静态代理简单但冗余,适合简单场景;

2401_85973273的博客 1260

代理模式——静态代理、动态代理

静态代理是以硬编码的方式,手动定义创建的代理类动态代理的代理类是在运行时动态创建的,在JDK的核心类库中,可以使用Java.lang.reflect.Proxy 类和 InvocationHandler 接口来生成动态代理基于接口的动态代理(jdk自带 Proxy)JDK动态代理是基于接口实现的代理,只能代理实现了接口的类。

m0_68041576的博客 1726

代理模式——动态代理、静态代理

⭐⭐代理模式是一种设计模式,能够保证在不改变源代码的情况下,给代码添加额外的功能。在java中,代理又分为两中:静态代理和动态代理。在说动态代理之前,我们先说一说静态代理,已经了解过的朋友可以直接跳过这一部分了~

qq_71416673的博客 1265

代理模式:静态代理和动态代理(JDK动态代理原理)

在以上的案例中,明星就是一个被代理类,而代理公司是一个代理类,明星的一些行为只能由公司来调用,而公司可以对明星的行为进行增强。动态代理即运行时动态的生成代理对象,和静态代理在编译时就确定代理对象不同,其灵活度更高,并且耦合度更低,动态代理又分为JDK动态代理和CGLIB动态代理。CGLIB动态代理是基于CGLIB工具类实现的,可以在运行时继承代理类根据代理类的类信息方法等生成代理类,因此被代理类不能被final修饰。我们在测试时是通过生成的代理类也就是上图的类来调用方法的,因此我们需要搞懂这个生成代理类。

m0_71338251的博客 1272
上一篇: 注解【介绍、基本Annotation、元Anntation、自定义注解、注入基本信息、对象】
下一篇: java.lang.NoSuchMethodException
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值