面试官:什么是责任链模式?

景区导览系统|景区展馆智能导览|小程序导览|电子导览手绘地图制作 AI 数字导游就像一位随时陪伴在游客身边的专属导游,能够根据游客的提问,迅速、准确地提供详细的景点介绍、历史文化知识讲解,甚至能根据游客的兴趣爱好和实时位置,为其智能规划个性化的游览路线。在手绘地图中可以显示景区中的景点信息、景点和景点之间的路径,也可以显示景区的关键地点信息:景区全景、植物景观、河流、道路、地形面貌、卫生间等公共设施~无论是景区还是展馆,道可云AI智能导览系统都能通过丰富的功能、先进的技术,为游客打造便捷、智能、个性化的游览体验,成为文旅行业数字化转型的得力助手。 阅读详情

前言

只有光头才能变强。

文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y

最近在看项目代码的时候发现「责任链模式」,于是想花点时间来写写什么是责任链模式。

不知道大家是怎么学习设计模式的,一般我都是用到的时候,或者接触到的时候才会去学。否则感觉学完就很容易就忘掉了,不能理解为什么要使用设计模式(因为没有真实的场景给我去使用)。

在之前我已经更新说几篇设计模式的文章了,我觉得写得「还行」,有兴趣的同学可以到我的GitHub上,关键字搜索「设计模式」,就能找到对应的文章。

不得不说,我现在负责项目的代码我常常会感叹:**这代码怎么这么骚啊!**项目里边用到了很多的设计模式,在最开始看的时候会很费劲(因为之前没学),但维护起来是真的方便。

一、什么是责任链模式?

在说责任链模式之前,我们先来聊聊「过滤器」。

过滤器相信大家都肯定学过了,在最开始学Servlet的时候我们会学到Filter。等学到Struts2的时候,我们会学到Interceptor。等学到SpringMVC的时候,我们会学到HandlerInterceptor。

但无论学哪个框架,我们发现是最终其实它还是做Filter这么一件事。说白了就是:

  • 把所有的过滤器都放在FilterChain里边,依次执行每个过滤器。

在我的GitHub对Filter,HandlerInterceptor,Interceptor都有讲到,如果想要复习的同学不妨进去搜索关键字「过滤器」「Struts2」「SpringMVC」

为什么看责任链模式要聊「过滤器」呢?后面会讲到,不要着急。

1.1 干掉敖丙和鸡蛋

举个例子:把我们的正常请求想象成一堆的杂物,里边有米豆,有鸡蛋,有敖丙公仔玩具等等一些杂物。

现在我们想要最后得到的是米豆,鸡蛋和敖丙玩具都被过滤掉。于是我们就可以搞两个滤网,把敖丙玩具和鸡蛋给过滤掉。

以最快的方式,我们可以写if来把这个需求给搞掂,下面上代码。

一个请求,我们使用Request对象来表示:

public class Request {
    // 请求的数据
    private String data;

    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }
}

针对请求,我们肯定是有一个接口处理请求的啦,我们使用Handler来表示:

public class Handler {

    public void handlerRequest(Request request) {
        
        // 得到请求的数据
        String data = request.getData();

        if (data.contains("鸡蛋")) {
            filterEgg(data);
        }
        if (data.contains("敖丙工具")) {
            filterAoBing(data);
        }
        // 我到这里就能拿到米豆了。
    }

    private void filterAoBing(String data) {
        //doSomething
    }

    private void filterEgg(String data) {
        //doSomething
    }
}

上面的代码大家不知道熟不熟悉,反正我就很熟悉,很多时候我就是这样写代码的(在现实里边很多代码就是这样的)。

1.2 如何更加优雅干掉敖丙和鸡蛋?

在某年某月产品过来告诉我,需要新增一种类型想要过滤的「白菜」

在某年某月产品过来告诉我,需要新增一种类型想要过滤的「鸡腿」

在某年某月产品过来告诉我,需要新增一种类型想要过滤的「鸡头」

于是我们的Handler处理就可能「膨胀」起来了,可能是这样?

public class Handler {

    public void handlerRequest(Request request) {

        // 得到请求的数据
        String data = request.getData();

        if (data.contains("鸡蛋")) {
            filterEgg(data);
        }
        if (data.contains("敖丙工具")) {
            filterAoBing(data);
        }
        if (data.contains("白菜")) {
            filterBaiCai(data);
        }
        if (data.contains("鸡头")) {
            filterJiTou(data);
        }
        if (data.contains("鸡腿")) {
            filterJiTui(data);
        }
        // 我到这里就能拿到米豆了。
    }

    private void filterJiTou(String data) {
        //doSomething
    }

    private void filterJiTui(String data) {
        //doSomething
    }

    private void filterAoBing(String data) {
        //doSomething
    }

    private void filterEgg(String data) {
        //doSomething
    }
}

明显的是,如果处理的流程改动比较大的话(需要增删改其中的某个流程),那我每次都需要更改handlerRequest的代码,增加/修改/删除一个if和一个处理方法。

更加面向对象的方式是这样的:将每个处理的方式抽象成一个类,每个类各司其职。

无论是过滤敖丙还是过滤鸡蛋还是过滤米豆,做的事都是过滤。我们就可以将其抽象成接口。于是我们就有一个接口,多个实现类。

public interface Filter {
    // 过滤
    void doFilter(String data);
}

class FilterEgg implements Filter {

    @Override
    public void doFilter(String data) {
        //doSomething
    }
}

class FilterAoBing implements Filter {

    @Override
    public void doFilter(String data) {
        //doSomething
    }
}

class FilterBaiCai implements Filter {

    @Override
    public void doFilter(String data) {
        //doSomething
    }
}

class FilterJiTou implements Filter {

    @Override
    public void doFilter(String data) {
        //doSomething
    }
}

每个各司其职的Filter都有可能被执行,我们可以将其串成一条链,抽象一层对外只暴露一个方法来替代if。于是我们可以写出一个FilterChain类

public class FilterChain {
    List<Filter> filters = new ArrayList<>();

    public FilterChain() {
        filters.add(new FilterEgg());
        filters.add(new FilterAoBing());
        filters.add(new FilterBaiCai());
        filters.add(new FilterJiTou());
    }
    public void processData(String data) {
        for (Filter filter : filters) {
            filter.doFilter(data);
        }
    }
}

改造过后,我们的Handler就长这个样子了:

public class Handler {
    public void handlerRequest(Request request) {
        // 得到请求的数据
        String data = request.getData();
        FilterChain filterChain = new FilterChain();
        // 处理数据
        filterChain.processData(data);
    }
}

如果我告诉你,这种的处理方式就是责任链模式,你会怎么想?

二、为什么责任链模式?

再来回顾一下,我做了些什么:

  1. 将处理的各个流程抽象为各个类(本来Handler里边有多个if和方法)
  2. 将多个类用Chain链起来,暴露一个方法给Handler使用
  3. done

下面我画了一张对比图:

是不是很简单?说到底还是抽象了一层(将每个处理抽象为一个类而已)。

那为什么要这样干?如果我要增加一个处理流程,我是得新增一个处理类,然后在链上增加相对应的类。操作也的确如此。

这不麻烦吗?要便捷的话,我还不如直接增加一个if,一个处理方法来得方便呢。

用责任链模式的好处就是分工明确,解耦,容易维护。

  • 将多个条件判定分散到各个的处理类上,相对于if else耦合性相对较低。
  • 增加一个具体的Handler处理类,不会影响到BaseHandler的代码

责任链模式的缺点:

  • 项目里边会有多个具体Handler类(因为每种处理都抽象为一个类,所以会有多个类)
  • 不好调试,初看代码时不好阅读。(对外只是一个doChain方法,而里边由多个处理类来组成,还得看相应的调用顺序)

三、再来聊聊责任链模式

我们从上面也可以看到责任链模式主要有以下特点:

  • 一个Handler接口,多个Handler处理类
  • 多个Handler处理类串起来形成一条链

有这两个特点我就称这些代码运用了责任链模式。在翻阅资料或者看书的时候,你可能会看到:“纯责任链和不纯责任链”

  • 纯:请求执行到某个具体的Handler,该Handler要么自行处理然后结束请求,要么不处理继续往下给别的Handler执行。

  • 不纯:请求执行到某个具体的Handler,该Handler自行处理了,还继续往下给别的Handler执行。

还有就是将各个具体的Handler串成一条链,这里边的实现会有各式各样的:

  • 在我例子里是直接new出一个ArrayList,然后在构造方法里边代码手动add到ArrayList的
  • 有可能会在代码里边每个具体Handler都会记录自己下一个Handler是谁
  • 有可能将Handler的初始化放在XML上
  • …//反正各种操作最终还是会将各个Handler串起来。

其实不必要在意纯和不纯的责任链模式,我们学设计模式是为了学它的思想。

四、看看JavaWeb的Filter

在文章最开头我就说了我们以前学过的Filter,其实Filter就是用了责任链模式。我们来简单看看代码:

我们在使用Filter过滤器的时候,要么在XML上配置<filter>,要么在代码上写上注解@WebFilter(filterName = "",urlPatterns = "")

这些配置都会在Web容器启动的时候被读取,读完这些配置,会将你写的Filter过滤器加到FilterChain里边:

我们可以看到Filter接口下有很多都实现了doFilter:

JavaWeb的Filter实际用到的也是责任链模式。

最后

设计模式本身不是一件很复杂的东西,像门面模式,模板方法模式都非常容易理解。学完了会有一种感觉:“啊?就这?”

重要的是学完能不能用到实际的工作中,这是非常难能可贵的。我们写代码按照自身的思维写if else是非常简单的,而设计模式往往需要绕一个圈才能把功能实现。

但是,合理运用设计模式的代码是非常好维护的。如果你懂设计模式,那代码会看起来非常清晰。如果你不懂设计模式,你就会感叹“这代码是真的骚阿”(这就是我…)。

好好学习,希望有朝一日,别人看到我的代码,在背后说「这人写的代码是真的骚,牛逼阿」。

参考资料:

  • 《设计模式之禅》
  • https://www.cnblogs.com/tanshaoshenghao/p/10741160.html
涵盖Java后端所有知识点的开源项目(已有5.8K star):https://github.com/ZhongFuCheng3y/3y

如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号「Java3y」。(微信搜Java3y即可关注)

  • 🔥Java精美脑图
  • 🔥Java学习路线
  • 🔥Java常用的开发工具
  • 🔥原创PDF电子书

PDF文档的内容均为手打,有任何的不懂都可以直接来问我(公众号有我的联系方式)。

在公众号下回复「888」即可获取!!

NTscan扫描工具 ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。 立即下载

相关推荐

避坑指南:Win10安装Docker Desktop时Hyper-V报错的7种解决方案(2024最新版)

本文提供了2024年最新、最全面的Windows 10系统下Docker Desktop安装时Hyper-V报错的解决方案指南。文章深入剖析了Hyper-V与Docker的共生关系,并系统性地给出了从BIOS/UEFI设置、Windows功能启用、bcdedit命令修复到处理多虚拟化环境共存等7种核心解决方案,帮助开发者彻底解决安装困局,顺利部署容器化开发环境。

weixin_28840143的博客 529

持续总结中!2024年面试必问 20 道设计模式面试题(八)

1、责任链模式(Chain of Responsibility Pattern)是如何实现的? 2、解释解释器模式(Interpreter Pattern)及其用途。

2401_84542969的博客 1162

从UE4到Unity:双叶高光技术在角色皮肤渲染中的移植全流程

本文详细解析了将UE4中的双叶高光技术移植到Unity引擎的全流程。该技术通过模拟皮肤油脂层和真皮层的不同反射特性,能显著提升角色皮肤渲染的真实感。文章从核心原理、贴图资产处理、Shader代码重构到参数调校,提供了完整的跨引擎移植实战指南,帮助开发者实现高质量的皮肤质感还原。

alice7model的博客 478

面试官问我什么是责任链模式,我把这篇文章甩给了他

「什么是责任链」责任链模式(Chain of Responsibility Pattern):责任链模式是⼀种对象的⾏为模式。我们可以简单地理解为:当一个请求从执行开始到结束,需要经过很多层的处理,此时我们可以将这些不同层的处理给抽象出来,其中的每一层就是一个过滤链路,将它们窜起来之后,就会形成链状结构。如下图所示:「为什么要这么设计,这样设计的好处在哪?」「解耦:」 可以将每一层的逻辑都单独封装...

Java知音 617

自动驾驶预测决策规划八股

预测规划八股个人总结。

dawushixiange的博客 479

【三维重建】基于多视角图像的三维重建

基于多视角图像的三维重建》

m0_64446860的博客 8759

金三银四面试题(二十六):责任链模式知多少?

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,旨在通过将请求的处理分布在一系列对象上,从而使得多个对象可以尝试处理同一个请求。这些对象被链接成一条链,每个对象都可以对请求进行处理,如果不能处理,则将请求传递给链中的下一个对象。

weixin_45700531的博客 485

RV1126 ROS2环境交叉编译及部署(基于官方Docker)

我的所有基于`RV1126`的机器人项目都是在`Ubuntu22.04`下进行开发的,在`Ubuntu18.04 Docker`容器中实现`RV1126`的`SDK`编译,详细可参考我之前的博客[《Ubuntu20.04/22.04下Docker方案实现多平台SDK编译》第2章](https://blog.youkuaiyun.com/w1820020635/article/details/147342689),`RV1126`的`ROS1`部署没什么难度,可以参考我之前的博客,这里记录了`ROS2`交叉编译及问题解决

w1820020635的博客 1143

设计模式-责任链模式(Chain of Responsibility)

责任链模式是一种面向对象设计模式,该模式中包含了一系列处理对象和命令对象。每个处理对象都有能力决定自己可以处理哪些命令对象,如果遇到无法处理的命令对象,它会将请求传递给下一个处理对象。这种模式的核心在于避免请求发送者与接收者之间的紧密耦合,让多个对象都有可能接收请求,并将这些对象连接成一条链,沿着这条链传递请求,直到有对象处理它为止。以公司员工请假为例,员工的请假请求可能有多个领导可以批准,但每个领导的批准权限不同。员工需要根据自己要请假的天数去找对应的领导签名。这就是责任链模式的一个生动实例。

miaoyl的博客 1万+

使用 Python 构建 Reddit 热帖爬虫:抓取热门讨论帖和评论

在现代互联网中,Reddit 被誉为全球最大、最活跃的讨论平台之一,汇聚了各种主题的帖子、评论和社交互动。因此,抓取 Reddit 上的热门帖子和评论可以为我们提供一个丰富的文本数据源,可以用于情感分析、话题建模、趋势分析等应用。Reddit 提供了官方的 API,可以让开发者获取包括帖子、评论、用户信息等在内的各种数据。我们可以结合上述方法,抓取多个热门帖子,并将每个帖子的标题、作者、发布时间和评论内容保存到一个数据结构中。每个帖子的对象包含了丰富的信息,如标题、内容、发布时间、作者等。

2201_76125261的博客 382

【GlobalMapper精品教程】094:GlobalMapper26简体中文版安装教程(附安装包下载)

【GlobalMapper精品教程】094:GlobalMapper26简体中文版安装教程(附安装包下载)- 基于深度学习的图像分析工具,用于自动识别土地覆盖分类、建筑物提取和车辆检测。新的太阳阴影分析工具,用于计算加载地形和 3D 要素的阴影。新的 GENERATE_SHADOWS 脚本命令允许自动执行这些计算。新增点云模型关键点自动识别。能够在自动点云分析工具中保存和加载自定义创建的要素模型。改进了像素到点中各种潜在重叠图像中 GCP 的自动识别。

智慧空间实验室 4894

责任链模式--通过面试

责任链模式: 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。责任链模式是一种行为设计模式。

zhanyd的博客 293

如何完全卸载axure软件以及解决安装axure后打不开的问题【2023年】

如何完全卸载axure软件以及解决安装axure后打不开的问题【2023年】

念兮为美 5139

面试官:在项目中用过责任链模式吗?

山东责任链模式,简而言之,就是将多个操作组装成一条链路进行处理。请求在链路上传递,链路上的每一个节点就是一个处理器,每个处理器都可以对请求进行处理,或者传递给链路上的下一个处理器处理。

竹林幽深 132

深度学习工具包 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")

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

面试官:兄弟讲一下责任链模式

看完这篇文章,责任链模式你就懂了!

yehongzhi1994的博客 1200

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

面试官:说说你对责任链模式的理解?应用场景?

一、是什么责任链模式(Chain of Responsibility Pattern)就是某个请求需要多个对象进行处理,从而避免请求的发送者和接收之间的耦合关系将这些对象连成一条链子,并沿...

weixin_44475093的博客 5469

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

字节面试:什么是责任链模式?

整挺好

敖丙 7213

行为型模式:责任链模式

十一大行为型模式之四:责任链模式。

小烁笔记 680

责任链模式

/ 定义校验结果封装对象// 快速创建成功结果// 快速创建失败结果// 校验方法(含传递逻辑)// 抽象链式处理器// 通用校验接口// 基础校验结果类// 静态工厂方法责任链模式是系统级的校验框架解决方案,非空校验是具体的校验手段实现。责任链模式(容器)└── 非空校验处理器(内容)└── 其他校验处理器(内容)非空校验应作为责任链中的基础校验节点简单场景可直接使用非空校验复杂业务系统推荐使用责任链模式整合所有校验规则。

shaozheng0503的博客 1172
上一篇: 程序员必备的「大数据入门」知识
下一篇: 面试必问干货!数据库索引和锁的知识!看完你就能拿offer
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值