了解代理模式这一篇文章就够了

电子技术课程设计:声音音量峰值检测显示系统设计 本文介绍了声音音量峰值检测显示系统的设计方案。系统采用分立元件设计,不使用单片机和集成运放,包含电源模块、声音采集放大电路、峰值检测保持模块、比较器、A/D转换及显示控制等部分。麦克风信号经两级晶体管放大后,通过二极管-电容电路检测峰值并保持,再经A/D转换显示为数字值(0000-9999)。系统采用9V电池供电,包含启动/清除控制功能,能指示声音过低或过高状态。详细阐述了各模块电路设计、参数计算和仿真验证,并提供了完整的原理图和PCB布线方案。该系统实现了声音峰值电压的准确检测与数字显示功能。 阅读详情

基本介绍

代理模式的核心思想就是:为一个对象(被代理对象)提供一个代理对象,并且通过代理对象控制对原来被代理对象的访问。可以简单理解为通过代理对象访问目标对象。这样做最大的好处就是可以在目标对象实现的基础上,增强额外的功能,起到扩展目标对象的效果。

被代理的对象可以是远程对象、创建时开销大的对象、需要安全控制的对象等。实现代理模式有不同的形式,主要有:静态代理、动态代理(也被称为JDK代理或接口代理)、Cglib代理(不需要实现接口,在内存中动态创建代理对象)。

单纯的通过文字描述大家可能对代理模式的理解还是不够深刻,我们可以通过一个简单的UML类图来加深对该模式的理解。

代理模式UML类图:

在这里插入图片描述

UML类图讲解:

TargetObject:表示目标对象也就是被代理的对象。
ProxyObject:代表的是代理对象。
Client:代表客户端,使用代理对象的类。

以上就是代理模式的一些基本概念,通过这些介绍相信大家对代理模式已经有了一个简单的认识,接下来就让菜鸟详细介绍一下上面提出的三种实现代理模式的方式,从而更加深入的了解代理模式。

静态代理

使用静态代理时需要让目标对象和代理对象一起实现相同的接口或者继承相同的父类。这样做的目的就是为了通过调用代理对象中和目标对象相同的方法来实现调用目标对象的方法,从而达到代理的效果。

静态代理UML类图:

在这里插入图片描述

代码实现:

代理对象和目标对象实现的共同接口

public interface CommonInterface {

  void method();

}

目标对象

public class TargetObject implements CommonInterface {

  @Override
  public void method() {
    System.out.println("被代理的类中的方法执行了!");
  }
}

代理对象

public class ProxyObject implements CommonInterface {

  // 通过接口聚合被代理的类
  private CommonInterface target;

  // 构造器
  public ProxyObject(CommonInterface target) {
    this.target = target;
  }

  @Override
  public void method() {
    System.out.println("开始静态代理!");
    // 执行目标类的方法。
    this.target.method();
    System.out.println("结束静态代理!");
  }
}

客户端测试类

public class Client {

  public static void main(String[] args) {
    TargetObject targetObject = new TargetObject();
    ProxyObject proxyObject = new ProxyObject(targetObject);
    proxyObject.method();
  }
}

执行结果

在这里插入图片描述

总结

优点:实现起来简单,并且容易理解,只要确保目标对象和代理对象实现共同的接口或继承相同的父类就可以在不修改目标对象的前提下进行扩展。

缺点:缺点也是显而易见的,必须有共同接口或父类,并且需要为每一个目标类维护一个代理类,当需要代理的类很多时会创建出大量代理类。一旦接口或父类的方法有变动,目标对象和代理对象都需要作出调整。

这种方式虽说简单但是灵活性不足。

动态代理(JDK代理、接口代理)

使用JDK代理的基本前提是目标对象必须要实现接口。使用该方式代理对象是不需要手动编写代理类的,代理类是通过JDK的API动态的在内存中创建的。

动态代理UML类图

在这里插入图片描述

代码实现JDK代理

目标对象需要实现的接口

public interface TargetInterface {

  void method();

}

目标对象

public class TargetObject implements TargetInterface {

  @Override
  public void method() {
    System.out.println("被代理的类中的方法执行了!");
  }
}

代理工厂

public class ProxyFactory {

  // 目标对象
  private Object target;

  // 构造器
  public ProxyFactory(Object target) {
    this.target = target;
  }

  // 通过JDK的API在内存中动态生成一个代理对象。
  public Object getProxyInstance() {

    /**
     * 参数介绍
     * ClassLoader loader:目标对象的类加载器
     * Class<?>[] interfaces:目标对象实现的接口
     * InvocationHandler h:事件处理器。执行目标对象的方法时,
     *  会触发该处理器中的invoke方法。
     */
    return Proxy
        .newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
            /**
             * 此处用到了java8的Lambda表达式。看不太懂的有可以用传统方式。
             * 传统方式:new InvocationHandler() { // 重写invoke方法 }
             *
             * 参数说明:
             * Object proxy:代理类的实例
             * Method method:目标对象方法
             * Object[] args:目标对象方法入参
             */
            (proxy, method, args) -> {
              System.out.println("JDK动态代理开始!");
              // 执行目标类的方法。returnVal是方法的返回值,没有返回值时为空。
              Object returnVal = method.invoke(target, args);
              System.out.println("JDK动态代理结束!");
              return returnVal;
            });
  }
}

客户端测试类

public class Client {

  public static void main(String[] args) {
    TargetObject targetObject = new TargetObject();
    ProxyFactory proxyFactory = new ProxyFactory(targetObject);
    // 注意:此处强转的类型只能是目标类实现的接口类型!!!
    TargetInterface proxyInstance = (TargetInterface) proxyFactory.getProxyInstance();
    proxyInstance.method();
  }
}

执行结果

在这里插入图片描述

总结

优点:使用JDK动态代理,可以将代理类的创建推迟到运行时期在内存中创建,这样就可以大大减少代理类的创建和维护。

缺点:目标类必须实现接口,还增加了代码的理解难度。

Cglib代理

基本介绍以及注意事项

1、使用Cglib进行动态代理的目标类不需要强制要求实现接口。
2、Cglib代理也叫做子类代理,它是在内存中动态的创建一个目标类的子类对象从而实现对目标类的代理。Cglib代理也是属于动态代理的一种。
3、Cglib是一个强大的高性能代码生成工具,它可以在程序运行时期扩展类与实现接口。许多AOP框架都有使用Cglib。
4、Cglib的底层是通过字节码处理框架ASM来转换字节码并生成新类的。
5、注意:使用Cglib代理的类不能是final修饰的,并且被代理类中final和static修饰的方法不会被代理。

Cglib代理UML类图

在这里插入图片描述

示例代码

目标对象

public class TargetObject {

  public void method() {
    System.out.println("被代理的类中的方法执行了!");
  }
}

代理工厂

public class ProxyFactory implements MethodInterceptor {

  // 目标对象
  private Object target;

  // 构造方法
  public ProxyFactory(Object target) {
    this.target = target;
  }

  // 创建目标对象
  public Object getProxyInstance() {
    // 创建一个工具类
    Enhancer enhancer = new Enhancer();
    // 设置父类
    enhancer.setSuperclass(target.getClass());
    // 设置回调函数
    enhancer.setCallback(this);
    // 创建代理对象
    return enhancer.create();
  }

  /**
   * 重写intercept,完成对目标对象中方法的扩展
   *
   * 参数介绍: 
   *    Object o:cglib动态生成的对象。 
   *    Method method:目标类中的方法。
   *    Object[] objects:方法的参数。
   *    MethodProxy methodProxy:根据目标类的方法生成的代理方法。
   */
  @Override
  public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
      throws Throwable {
    System.out.println("Cglib代理模式开始!");
    /**
     * invoke方法入参说明:
     *  Object obj:方法所对应的类的对象,在该代码示例中指的就是目标类。
     *  Object... args:方法的入参。
     */
    Object invokeValue = method.invoke(target, objects);
    System.out.println("Cglib代理模式结束!");
    return invokeValue;
  }
}

客户端测试类

public class Client {

  public static void main(String[] args) {
    TargetObject targetObject = new TargetObject();
    ProxyFactory proxyFactory = new ProxyFactory(targetObject);
    TargetObject proxyInstance = (TargetObject) proxyFactory.getProxyInstance();
    // 执行代理对象的方法,会触发ProxyFactory类的intercept方法,从而实现对目标对象的调用。
    proxyInstance.method();
  }
}

执行结果

在这里插入图片描述

总结:

优点:不需要额外维护代理类,并且也不需要强制要求被代理的目标对象实现接口,使得代码更加的灵活。

缺点:和JDK的动态代理一样,增加了代码的理解难度。

总结

通过“菜鸟”的介绍相信大家对代理模式也有了一定的认识。以上介绍的三种方式其使用时的选择时机需要根据实际情况考虑,一般当我们需要代理的类少的时候,可以考虑使用静态代理,但是静态代理的选择一般都比较少,因为其维护成本要高,并且局限也大。当被代理的目标类实现了接口时可以考虑使用JDK代理,反之当目标类没有实现接口时就只能选择使用Cglib代理了。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。
在这里插入图片描述

C++(Qt)软件调试---gdb调试入门用法(12) 学习GDB可以帮助程序员更好地调试程序,找到程序中的错误和问题,提高程序的质量和稳定性。 在开发大型软件时,程序中可能存在许多错误和问题,这些问题可能会导致程序崩溃或者出现不可预期的行为。 使用GDB可以帮助程序员更快地找到这些问题,并且提供一些调试工具来帮助程序员更好地理解程序的行为。 阅读详情

相关推荐

使用 pip 安装 pygame 遇到的问题

今天尝试学习使用 pygame 时,按照我的习惯一发 pip install 下去,本以为很简单的事情,没想到遇到了不少问题,顺手记录一下。 0x01. 无法找到 “SDL.h” 文件 pygame 是使用 SDL 库写就的游戏框架,自然强依赖于 SDL,我的 python@3 是使用 macOS 的 brew 管理器直接安装的,可能由于不是编译安装的问题,缺少了这个库,继续使用 brew 安...

Mitscherlich的博客 8621

Spring5学习笔记—CGlib动态代理

前面文章我们学习了关于Spring的IOC与AOP相关知识点,在此之前,我们主要学习Spring的一些核心概念,IOC和AOP等等。我们之前学习了简单了解了AOP如何借助动态字节码技术来构建动态代理类。实现动态代理的方式不止一种。JDK动态代理和CGlib动态代理,主要主要介绍CGlib动态代理。好了,话不多说,让我们开始吧😎😎😎。CGLib**(Code Generation Library)**是一个强大的、高性能的代码生成库,它是基于Java字节码操作的开源框架。

分享思想,留下痕迹。 1万+

Tessent ATPG进阶:解锁多种Fault Model的工程实践与选型指南

本文深入探讨Tessent ATPG中多种Fault Model的工程实践与选型策略,涵盖Stuck-at、Transition、Bridge等核心模型的应用场景与配置技巧。通过实际案例解析,展示如何组合不同Fault Model提升芯片测试覆盖率,特别针对汽车电子、超低功耗芯片等复杂场景提供专业解决方案。

weixin_30219613的博客 199

AOP(JDK的动态代理模式)

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。

川泽的博客 403

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

本文详细介绍了企业微信群机器人Webhook的配置流程,从创建机器人到获取Webhook地址,再到发送各类消息的完整步骤。通过Python代码示例展示了文本、Markdown等消息类型的发送方法,并提供了性能优化建议和常见问题排查技巧,帮助企业高效实现自动化消息推送。

weixin_29208327的博客 6846

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7711

你还在new对象吗?用个“抽象工厂模式”生产对象它不香吗!

今天跟大家分享一下工厂设计模式家族中的“抽象工厂模式”。 简介 了解工厂模式的都知道,工厂模式就是用于大量创建某种,某类,或者某批对象时的一种优秀的解决方案。本文介绍的“抽象工厂模式”就是工厂模式的一种体现,是属于建造型模式的一种。 抽象工厂模式中有四个角色:分别是抽象产品角色,具体产品角色,抽象工厂角色,具体工厂角色。 其实“抽象工厂模式”很好理解,我给大家举个小例子,各位优秀的读者们应该就可以看懂了,看的时候记得将上面的四种角色代入进去,这样方便大家理解与记忆。 一个老板,想要生产汽车(这里所说的.

first_M的博客 319

2026年经典爬虫案例专栏|第17篇:学术论文爬虫实战——知网与万方数据采集

字段名说明数据类型title论文标题字符串authors作者列表列表abstract摘要字符串keywords关键词列表列表journal发表期刊字符串year发表年份整数volume卷号字符串issue期号字符串pages页码范围字符串citations引用次数整数downloads下载次数整数doiDOI编号字符串url论文链接字符串学术论文爬虫是科研工作的重要辅助工具,可以帮助研究人员高效地收集和管理论文数据。

2201_76125261的博客 1063

获取JDK动态代理/CGLIB代理对象代理的目标对象。

问题描述::我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法一律不出现,debug后发现这个servie实例被spring替换成jdkdynmicproxy类,而不是原始对象了,,它里面只有service继承的接口方法,而没有extends 过的super c...

weixin_30855761的博客 536

使用YubiKey进行全盘加密、加密启动分区以及利用UEFI安全启动的详细指南

在本教程中,我们将使用YubiKey来增强电脑的安全性,通过加密整个硬盘,确保只有持有正确YubiKey的人才能访问。UEFI安全启动是一种在UEFI固件级别实施的安全标准,确保计算机仅启动签名的启动加载程序。为了符合您的要求,我将以此方式分配内容,确保每部分都有详尽的说明和代码。现在,您已经成功地使用YubiKey设置了全盘加密,并使用UEFI安全启动为系统增加了额外的安全层。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。

qq_38334677的博客 1006

Nature、science、cell旗下刊物

Nature\science\cell子刊说明

计算机视觉 5606

获取JDK动态代理 CGLIB代理对象代理的目标对象

公司基础框架是通过反射来获取controller层的,会丢失aop的东西,修改框架拿到被代理的对象就行了。 public static Object getTarget(Object proxy) { if (!AopUtils.isAopProxy(proxy)) { return proxy;// 不是代理对象 } ...

weixin_34391854的博客 544

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

cglib动态代理_了解代理模式这一篇文章就够了

基本介绍代理模式的核心思想就是:为一个对象(被代理对象)提供一个代理对象,并且通过代理对象控制对原来被代理对象的访问。可以简单理解为通过代理对象访问目标对象。这样做最大的好处就是可以在目标对象实现的基础上,增强额外的功能,起到扩展目标对象的效果。被代理的对象可以是远程对象、创建时开销大的对象、需要安全控制的对象等。实现代理模式有不同的形式,主要有:静态代理、动态代理(也被称为JDK代理或接口代理)...

weixin_39692761的博客 124

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

代理模式,看这一篇就足够!

定义 代理模式(Proxy Design Pattern)的原理和代码实现都不难掌握。它在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。 原理 下面是一段登录和注册逻辑的代码,内部加入了性能计数器,用来收集接口请求的原始数据。 public class UserController { //...省略其他属性和方法... private MetricsCollector metricsCollector; // 依赖注入 public Use.

weixin_46569059的博客 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")

代理模式看这一篇就够了~

前言 不知各位是否还记得这两篇文章APP启动流程解析和Android Hook告诉你 如何启动未注册的Activity,这两篇文章中使用的技术基础都包含了 代理模式,其中在文章中也说道 “说到代理其实就是代理模式,关于什么是代理模式以及动态代理和静态代理的使用可以持续关注我,后面会单独写篇文章进行介绍。” 如今整整一年过去了,我还是曾经那个少年,没有一丝丝改变。 这篇文章来了~ 什么是代理模式 说到设计模式,离我们特别远,又特别近。 问许多工程师,设计模式用过哪些,相信很多人都...

黄林晴 5736

设计模式之代理模式(ProxyPattern)

设计模式之代理模式(ProxyPattern) 文章目录设计模式之代理模式(ProxyPattern)一.代理模式(ProxyPattern)二.编程实例1.图片读取案例2.String类访问修饰符[]读写操作区分案例 一.代理模式(ProxyPattern) 代理模式是创建一个代理类,来帮助我们处理真实类,一般来说,这种代理类有点像明星的经纪人,如果你想接触到明星,必须先和他们的经纪人打交道。...

Worthy_Wang的博客 476

代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 介绍 意图:为其他对象提供一种代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者...

ThinkWon的博客 7059

一篇文章带你搞懂代理模式

一、前言   代理模式是一种很常见的设计模式,在多线程、aop、远程代理等场景中均有体现,代理在我们的生活中也是很随处可见的。代理模式即为一个真实对象提供了一个代理对象,这个代理除了拥有真实对象的功能外,还能在不改变真实对象的情况下进行功能的增强且也能达到安全控制的效果。 1、代理分类 静态代理 动态代理 基于接口:JDK代理 基于类:Cglib代理 2、代理角色 AbstractSubject(抽象角色):真实角色和代理角色都实现的接口或抽象类 RealSubject(真实角色):真正提供功

qq_40242512的博客 1295

代理模式 (ProxyPattern)

文章目录代理模式 (ProxyPattern)代理模式的定义代理模式的优点代理模式的缺点代理模式的结构代理模式的实现普通代理强制代理动态代理AOP使用场景 代理模式 (ProxyPattern) 代理模式的定义 为其他对象提供一种代理以控制对这个对象的访问。 代理模式的优点 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。 具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱如来佛的手掌(接口),那我们的代理类完

有问题的请私信或关注v【技术印记】留言 414

代理模式(ProxyPattern)

代理模式(ProxyPattern)

明明明的博客 543

一篇文章快速搞懂代理模式及其实现

代理模式(Proxy Design Pattern)是为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。 一、代理模式介绍 在结束创建型模式的讲解后,从这一篇开始就进入到了结构型模式,结构型模式主要是总结一些类和或对象组合在一起的结构。代理模式在不改变原始代理类的情况下,通过引入代理类来给原始类附加功能。 代理模式的主要结构如下: Subject:抽象主题类,通过接口或抽象类声明主题和代理对象实现的业务方法 Re

hello_1566的博客 460

代理模式【Proxy Pattern 】

博客地址  http://blog.youkuaiyun.com/ftx2540993425   下面横线以上内容是借鉴别人的,为了表达对作者的敬意,不做不恰当的修改,我个人的总结在后面。     什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。

菜鸟的飞翔 636

反射看这一篇文章就够了

Java的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制.

IT枫斗者的博客 359
上一篇: 优秀程序员必备技能:设计模式之——享元模式
下一篇: 优秀程序员必备技能:设计模式之——模板模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值