代理模式和适配器模式区别

代理模式和适配器模式有什么区别 (Proxy Pattern)和(Adapter Pattern)都是结构型设计模式,它们有不同的应用场景和目标,虽然在某些方面看起来相似,但它们的意图和实现方式有显著的区别。 阅读详情

代理模式 vs 适配器模式 完整详解+核心区别

一、先分别吃透两种模式本质

1. 适配器模式(Adapter,结构型)

核心目的:做「转换兼容」
两个已有接口不匹配,通过适配器做一层接口转换,让原本不能协作的两类代码一起工作。

  • 关键词:兼容、翻译、转换、统一接口
  • 角色:
    • 目标接口 Target:我方程序期望调用的统一接口
    • 被适配者 Adaptee:已有旧接口/第三方类,方法名、参数和我方不匹配
    • 适配器 Adapter:包装 Adaptee,实现 Target,内部做参数、方法转发转换
  • 类比:转换插头
    插座是标准Target(国标三脚),国外电器是Adaptee(美标两脚),适配器插头做转换,让电器插上插座。
两种实现
  1. 类适配器:继承被适配类 + 实现目标接口(Java单继承很少用)
  2. 对象适配器:组合持有被适配对象(主流)

2. 代理模式(Proxy,结构型)

核心目的:做「控制增强」
用一个代理类包装原始目标对象,对外暴露完全一模一样的接口,不修改原有接口定义,在方法前后增加额外逻辑(权限、缓存、日志、延时创建、远程调用)。

  • 关键词:控制、增强、拦截、中介、透明访问
  • 角色:
    • 抽象主题 Subject:原始对象与代理共同实现的统一接口
    • 真实对象 RealSubject:业务核心对象
    • 代理 Proxy:实现同一接口,持有真实对象,拦截所有方法
  • 类比:中介/经纪人
    明星(RealSubject)和经纪人(Proxy)对外联系方式完全一致(都能接演出),但经纪人会做前置筛选报价、后置签合同,明星只负责表演。
常见分类
  • 静态代理:手写代理类
  • 动态代理:JDK动态代理、CGLIB(Spring AOP底层就是动态代理)
  • 远程代理、虚拟代理、保护代理、缓存代理

二、最核心本质差异(一句话区分)

  1. 适配器:接口不一样,做转换,解决「不兼容」
    对外提供新接口,抹平新旧/第三方接口差异;使用者看不到原始类接口。
  2. 代理:接口完全一样,做增强,控制访问
    对外和原始对象完全相同接口,使用者无感知,透明调用,只附加额外逻辑。

关键分水岭:接口是否改变

  • 调用方期望的接口 ≠ 原始类接口 → 适配器
  • 调用方期望的接口 = 原始类接口 → 代理

三、分层详细对比

1. 设计目标不同

适配器

打通两套不兼容接口,复用已有第三方/旧代码,不用修改原有代码。
场景:老系统接口、第三方SDK、不同组件整合。

代理

在不改动原对象代码前提下,对原有功能进行拦截、增强、管控。
场景:权限校验、日志、缓存、懒加载、远程RPC、事务、限流。

2. 对外暴露接口

适配器

适配器实现全新的目标接口Target,内部调用被适配者Adaptee的异构方法。
外部调用Adapter的是一套新方法名,和Adaptee方法名完全不同。
示例:

  • Target:pay(amount)
  • Adaptee第三方支付:transferMoney(money, channel)
  • Adapter内部:pay() 里转换参数调用 transferMoney()
代理

代理和真实对象实现同一个接口Subject,方法名、参数、返回值完全一致。
外部调用Proxy的方法,和直接调用RealSubject无任何区别。
示例:

  • 统一接口:queryOrder(Long id)
  • Proxy.queryOrder() 先查缓存,无缓存再调用 RealSubject.queryOrder()

3. 与被包装对象的关系

适配器

被包装的 Adaptee 是外部/老旧异构组件,本来就不适合当前系统调用规范,两者设计初衷无关。
适配器是翻译官。

代理

被包装的 RealSubject 是系统核心业务对象,本身完全满足业务功能,只是需要附加控制逻辑。
代理是保镖/中介。

4. 是否改变调用行为

适配器

核心逻辑委托给被适配者,适配器只做参数、格式转换,不新增额外横切逻辑。
没有前置校验、缓存、日志这类增强,仅做格式翻译。

代理

核心逻辑依然委托真实对象,但会增加前后附加逻辑:
前置:权限校验、参数校验、缓存查询
后置:日志记录、耗时统计、事务提交

5. 代码示例直观区分

示例1:适配器(接口不匹配,转换)
// 目标接口:系统统一支付标准
public interface Payment {
    void pay(BigDecimal money);
}

// 第三方老支付SDK(接口不兼容)
public class OldThirdPay {
    public void transfer(BigDecimal cash, Integer type) {
        System.out.println("第三方转账:"+cash);
    }
}

// 适配器:统一转换成Payment接口
public class PayAdapter implements Payment {
    private OldThirdPay adaptee = new OldThirdPay();

    @Override
    public void pay(BigDecimal money) {
        // 转换参数,适配第三方接口
        adaptee.transfer(money, 1);
    }
}
// 使用:业务只认Payment,完全不知道OldThirdPay存在
Payment pay = new PayAdapter();
pay.pay(new BigDecimal(100));
示例2:代理(接口完全一致,增加缓存增强)
// 统一抽象接口
public interface OrderService {
    Order getOrder(Long id);
}

// 真实业务类
public class OrderServiceImpl implements OrderService {
    @Override
    public Order getOrder(Long id) {
        // 查询数据库
        return db.selectById(id);
    }
}

// 缓存代理,接口完全一致
public class OrderProxy implements OrderService {
    private OrderService real = new OrderServiceImpl();
    private Map<Long, Order> cache = new HashMap<>();

    @Override
    public Order getOrder(Long id) {
        // 前置增强:缓存拦截
        if (cache.containsKey(id)) {
            return cache.get(id);
        }
        Order order = real.getOrder(id);
        // 后置增强:放入缓存
        cache.put(id, order);
        return order;
    }
}
// 使用方式和原对象完全一致,上层无感知
OrderService service = new OrderProxy();
service.getOrder(1001L);

6. 适用业务场景对比

适配器典型场景
  1. 整合第三方SDK(微信/支付宝老版本接口、OSS存储、第三方短信)
  2. 新旧系统兼容:老数据库DAO、遗留接口适配新业务框架
  3. 统一多类异构工具:多种日志组件、多种文件存储适配统一工具类
  4. 不同协议转换:HTTP接口适配内部RPC调用格式
代理典型场景
  1. 动态代理做AOP:日志、切面、事务、限流、权限校验(Spring核心)
  2. 缓存代理:数据库查询加本地缓存、Redis缓存
  3. 虚拟代理:大图片/大文件延迟加载(用到才创建真实对象)
  4. 保护代理:接口访问权限校验,未登录拦截调用
  5. 远程代理:RPC客户端代理,屏蔽网络通信细节(Dubbo/Feign)
  6. 静态代理:封装工具类增加统一异常处理

7. 优缺点与取舍

适配器优点

快速兼容异构代码,无需修改第三方/遗留类;统一对外调用标准。
缺点:仅做转换,无法统一增加横切增强逻辑。

代理优点

无侵入增强原有业务,上层调用零改动;动态代理可统一批量切面处理。
缺点:只能用于接口匹配的场景,不能解决接口不兼容问题。


四、表格汇总对比

对比维度适配器模式(Adapter)代理模式(Proxy)
核心职责接口转换、兼容异构组件透明拦截、功能增强、访问控制
对外接口提供全新目标接口,与被包装对象接口不同和原始对象完全相同接口,方法签名一致
设计关系解决「接口不匹配」问题不改变接口,附加额外逻辑
类比转换插头、翻译官经纪人、中介、保镖
包装对象第三方/遗留异构类系统原生标准业务对象
附加逻辑仅参数/格式转换,无横切增强缓存、日志、权限、事务、延时加载
上层感知上层只依赖Target,看不到原始类上层完全无感知,像直接调用原对象
典型框架应用SpringMVC HandlerAdapter、集合工具适配Spring AOP动态代理、Dubbo远程代理

五、极易混淆的边界场景区分技巧

场景1:如果我包装后,方法名变了 → 适配器

需要把 sendMsg(String phone,String content) 改成系统统一 sendSms(SmsDTO dto),参数结构重组,一定是适配器。

场景2:包装后方法名、参数完全不变,只是加日志/缓存 → 代理

getUser(Long id) 前后加打印耗时、缓存查询,接口一丝不动,一定是代理。

场景3:同时需要转换+增强怎么处理?

分层组合:外层代理做增强,内层适配器做转换
调用链路:Controller → Proxy(日志/权限)→ Adapter(接口转换)→ 第三方SDK

六、一句话记忆口诀

接口不一样,要兼容,用适配器;
接口一模一样,要增强,用代理。

TSMaster实战:如何用LIN总线唤醒你的汽车电子系统(附波形分析) 本文通过TSMaster工具实战解析LIN总线唤醒机制。详细介绍了LIN网络唤醒的协议要求、时序参数计算,并演示了如何在TSMaster中配置唤醒信号、捕获分析波形,以及验证休眠流程。文章结合常见问题排查,为汽车电子工程师提供了从理论到实践的完整调试指南。 阅读详情

相关推荐

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

本文详细解析了企业微信群机器人的Webhook配置全流程,从创建机器人、获取关键Webhook地址,到使用代码发送文本、Markdown等多种消息类型。内容涵盖安全加固、错误处理及与CI/CD等系统集成的实战指南,帮助企业快速构建高效、稳定的内部通知系统。

ik678901的博客 1791

适配器模式和代理模式的区别

适配器模式是因为新旧接口不一致导致出现了客户端无法得到满足的问题,但是旧的接口不能被完全重构,而我们想使用实现了这个接口的服务,就应该把新接口转换成旧接口; 代理模式提供的接口和原来的接口是一样的,代理模式的作用是不把实现直接暴露给client,而是通过代理这个层,并且代理能够做一些处理。 ...

深海的鱼 887

ARM Linux工控板+C# .NET Core:倍福ADS协议轻量化工业控制(附跨平台部署代码)

某自动化设备厂的倍福PLC控制系统曾依赖传统x86工控机:单台设备需配备1台Intel i5工控机(成本约8000元),功耗30W+,且Windows系统稳定性受工业环境干扰(如电磁辐射导致蓝屏)。更棘手的是,设备需部署在产线边缘(空间狭小),x86工控机的体积(4U机架)和散热需求(风扇噪音)难以适配;而多设备部署时,高硬件成本和高功耗导致年运维成本超20万元。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 954

代理模式VS适配器模式

适配器模式 定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。简单点就是需要的东西就在面前,但却不能使用,而短时间又无法改造=它,于是我们就想办法适配它。 举一个生活中最常见的例子!就如我们的球类吧!如排球,如果只是想拿着排球在自行车老大爷那说点好的来打气是行不通,因为那的打气筒是无法往...

weixin_30321449的博客 390

Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建

yocto quick start up带大家快速上手

fulinux的博客 5万+

ubuntu-emto-cpa 测试和使用(单核运行)

ubuntu-emto-cpa 测试和使用(单核运行)

qq_45834835的博客 1402

适配器模式与代理模式的区别

适配器模式与代理模式的区别 适配器模式:https://blog.youkuaiyun.com/weixin_49639753/article/details/120472980 代理模式:https://blog.youkuaiyun.com/weixin_49639753/article/details/119322908 区别: 目的不同 适配器模式:将一个接口转换成客户希望的另一个接口,使原本不兼容的接口类可以一起工作。 代理模式:给一个对象提供一个代理对象,并由代理对象控制对原对象的引用,是在对原有对象功能的增强,使客户

解忧小店 2219

深度学习实战107-基于Qwen3+GraphRAG+Agent的智能文档管理系统:精准问答与决策支持

在当今信息爆炸的时代,企业面临海量文档的管理与利用挑战。传统文档管理系统虽然提供了存储和检索功能,但缺乏对文档内容的深度理解与分析能力,更难以实现基于知识的决策支持。基于多模态大模型Qwen3、GraphRAG技术与Agent框架构建的智能文档管理系统,能够突破传统限制,实现文档内容的精准解析、知识图谱的自动构建、复杂关系的推理分析以及决策建议的生成,为企业知识管理带来革命性变革。

微学AI的博客 866

代理模式和适配器模式的区别

适配器模式 #include <iostream> using namespace std; class subject { public: virtual void request()=0; }; class adaptee { public: void specialRequest(){ cout <&lt...

abcdefgh111810的博客 311

自然语言处理6 -- 情感分析

1 概述 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评价,可以分析菜品口味、送达时间、送餐态度、菜品丰富度等多个维度的用户情感指数,从而从各个维度上改进外卖服务。 情感分析可以采用基于情感词典的传统方法,也可以采用基于深度学习的方法,下面详细讲解 ...

谢杨易的博客 5万+

YOLOv8 PCB缺陷检测系统全流程实战:从开发到UI展示详解

毕设路上难免有波折,但只要跟着这个教程把“数据集处理、模型训练、UI开发”每一步都落实,你就已经超越了大多数同学。这个“PCB缺陷检测系统”既有技术深度(YOLOv8是工业级主流算法),又有工程价值(解决电子制造的实际痛点),还具备出色的可视化展示——这样的毕设,拿高分是水到渠成的事。

FJN110的博客 217

初涉c#设计模式-几种易混淆的设计模式区别

StrategyPattern和Simple Factory的区别和用法 Strategy Pattern主要用于抽象特定算法或行为的设计模式模式,外表类似于简单工厂模式,但简单工厂模式主要用于生成产品,返回new实例,然后进行相应的编程,而策略模式倾向于指定的唯一的算法策略,初始化实例策略类之后,直接调用算法。在简单工厂中我们只需要传递相应的条件就能得到想要的一个对象,然后通过这个对象实现算法...

weixin_33892359的博客 165

关于 SAP UI5 应用 url 中的特殊符号 # 的作用介绍

符号在 SAP UI5 的 URL 中不仅仅是一个分隔符,更是动态路由、状态管理和深链接的关键所在。通过合理使用,开发者可以实现高效、流畅的用户体验,同时保持系统的可维护性和扩展性。通过 SAP UI5 提供的灵活路由机制,企业应用可以轻松实现复杂导航需求,同时为用户提供直观的交互体验。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 415

适配器模式、装饰器模式、代理模式的区别

适配器 vs 代理模式

expleeve 4754

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计模式——结构型模式之代理模式和适配器模式(类比+图解,从无到有,一文看懂几种模式的区别)

设计模式 系列文章: 一、创建型模式——工厂模式 二、创建型模式——单例模式、原型模式 三、创建型模式——建造者模式 四、结构型模式——装饰者模式 五、结构型模式——代理模式、适配器模式 文章目录设计模式前言一、 代理模式的定义二、代理模式类图和一个设计实例三、适配器模式定义四、装饰者、代理、适配器的区别 前言 代理模式属于结构型模式中最为简单的模式之一,易于理解的同时又妙用无穷,能够适用于远程代理,安全保护,智能处理等多种方面。 适配器模式较为复杂,同时与之前的装饰者又神似而有所差异,在Ja

代码之狐的博客 3283

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

门面模式、代理模式、适配器模式的区别

门面模式、代理模式、适配器模式,这三种模式都很接近,他们的区别是: 1、门面模式: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,简化了系统的使用; 银行柜台办理业务可以理解为门面模式的一种,客户通过银行柜台办理业务,无需了解银行内部复杂的业务逻辑处理,柜台办理员只是把银行能提供的业务为客户端办理,银行没有提供的服务,柜台办理员也无法办理的。 2、代理模式: 为...

m0_37477061的博客 1144

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

适配器模式、装饰器模式和代理模式的联系和区别

联系: 三者的限制条件层层递进,递进关系如下: 代理模式 装饰器模式 适配器模式 区别: 适配器模式是将一个类A装换成另一个类B。类A和类B的接口不同 装饰着模式是为一个类A增添新的功能,从而变成类B。类A和类B的接口相同,在构造器中传递对象参数可以动态的添加和撤销新的功能 代理模式是为一个类A转换操作类B。类A和类B的接

zjyzz13的博客 654

策略模式 代理模式 责任链模式 适配器模式 区别联系NS图

@[toc] 策略模式 代理模式 责任链模式 适配器模式 区别联系NS图

weixin_38235131的博客 678

模式的秘密-适配器模式和代理模式的区别

一.简介        适配器模式:适配器模式(英语:adapter pattern)有时候也称包装样式或者包装。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。        代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和...

weixin_33866037的博客 228

Java 设计模式:代理模式、适配器模式与装饰器模式的区别于联系

在软件开发过程中,设计模式起着至关重要的作用,它们能够帮助开发者更高效地解决常见的软件设计问题,提高软件的质量和可维护性。代理模式、适配器模式和装饰器模式是三种较为常用且容易混淆的设计模式,本文将深入剖析它们之间的区别,以帮助读者更好地理解和运用这些设计模式。

weixin_69477306的博客 1451
上一篇: 建造者模式和模板方法模式的区别
下一篇: 简单工厂模式、工厂模式、抽象工厂模式区别
越甲八千
博客等级 码龄11年 2959粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值