- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
讲实话,博主当初学习完整设计模式时,这三种设计模式单独摘哪一种都是十分清晰和明确的,但是随着模式种类的增加,在实际使用的时候竟然会出现恍惚,例如读开源代码时,遇到不以模式命名规范的代码时,一时难以说清具体是使用的这三种里的哪一种.
之所以会出现混淆的原因是,三种模式的实现都是基于面向接口这一思想,三种模式都是针对某一个具体的接口实现,并在其实现类上用一个对象对另一个对象提供间接访问.
基于混淆点,从类图上来看,适配器模式就可以最先被区别出来,适配器的类结构图:
从类图上来看,适配器的主角是Adapter这个类,这个类与目标接口是实现关系,但是Adaptee则不同,它可以是一个接口,也可以是一个具体的类,它是与Target平级的一个对象,与Target毫无关系,而Adapter与它的关系是对象组合,是Adaptee作为Adapter的一个内部成员变量,Adapter的目的是将 Adaptee适配为Target.
。
相比于适配器模式,代理模式和装饰模式反而更容易被混淆, 混淆的原因是二者都是基于一个公共接口,且主角类(Proxy和Decorator)又都是以组合对象的形式,对目标对象(RealSubject和ConcreteComponent)进行二次操作。实现上来看,两者十分相似.
但是注意,这里还是有不同, 。
也就是说,两者提供间接访问的对象不同,一个(代理模式)是基于具体的类,而另一个(装饰模式)是基于抽象的接口 。这也是为什么只可以使用一次的request对象要基于装饰模式提供封装来达到二次使用的原因(详细可翻阅设计模式:从HttpServletRequestWrapper了解装饰者模式),基于抽象接口提供的间接访问是不会破坏具体对象的内容.
适配器模式的主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。也就是说,客户端需要的功能应该是已经实现好了的,不需要适配器模式来实现,适配器模式主要负责把不兼容的接口转换成客户端期望的样子就可以了.
适配器的本质是转换功能,以提高复用性。不同于代理和装饰,适配器中的目标对象可能与需要适配的对象毫无关系,适配过程中代码甚至是全量的重写,它的目标是将两个内容沿其中某个为主进行融合.
代理模式是通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端得到这个代理对象后,对客户端并没有什么影响,就跟得到了真实对象一样来使用。当客户端操作这个代理对象的时候,实际上功能最终还是会由真实的对象来完成,只不过是通过代理操作的,也就是客户端操作代理,代理操作真正的对象。 正是因为有代理对象夹在客户端和被代理的真实对象中间,相当于一个中转,那么在中转的时候就有很多花招可以玩,比如,判断一下权限,如果没有足够的权限那就不进行中转了,或者中转到别的操作中.
代理模式的运行逻辑:
代理模式的本质是控制对象访问。核心在于Proxy角色, 类似于中间商,是目标对象的一个“前沿发言人”,你想要访问目标对象,或者购买目标厂家的商品,必须从我代理商这里走, 我甚至可以不创建被代理对象,自己冒充被代理对象(直接以贴牌产品当作目标产品卖你).
装饰模式能够实现动态地为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观。当装饰过后,从外部使用系统的角度看,就不再是使用原始的那个对象了,而是使用被一系列的装饰器装饰过后的对象。这样就能够灵活地改变一个对象的功能,只要动态组合的装饰器发生了改变,那么最终所得到的对象的功能也就发生了改变。从这一点上来讲,代理模式也可以满足,但是不同的是,装饰模式这里有一个代理无法越过的原则,那就是代理模式必须有目标对象,否则装饰就无从谈起.
装饰模式的本质是通过组合来加强目标对象的能力,是对象能力的延申。装饰模式是在原有对象的基础上进行外层包装,可以对目标对象的每一个方法都进行前置、后置的补充和加强,但是本质上并没有改变原对象,是一种扩展思维,这一点可以参考AOP的思想.
。
。
最后此篇关于设计模式:代理、装饰和适配器模式的区别的文章就讲到这里了,如果你想了解更多关于设计模式:代理、装饰和适配器模式的区别的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有 3 个 AutoCompleteTextView,我想在它们上面注册 2 个 String[] 适配器。目前,我正在这样做: atw_from.setAdapter(new ArrayAdapt
我需要实现一个 recyclerView 来显示我对 Parse 的查询,所以我已经做到了: private class Pagination extends RecyclerView.OnScro
我对 BizTalk 相当陌生,目前我只是探索它的功能并了解不同部分(架构、编排、端口等)如何协同工作。我对其适配器有疑问: 不同的适配器是否已经随 BizTalk 服务器安装一起预装并准备好配置,或
我在 BizTalk 中测试 MQSC 适配器以与 Z/OS 主机上的队列通信时遇到问题。 测试场景:通过 Biztalk 发送消息时,我(强制)停止并启动主机 channel ,以模拟主机 IPL。
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我想用我的音频单元在iPhone上录制一条音频信号,该信号来自一条普通的3.5毫米音频电缆(例如,另一部iPhone作为声源)。 由于iPhone具有4端口耳机插孔,因此无法直接插入。 我尝试了不同种
[请参阅下面的更新] 我很难定义模式。我的同事说这是适配器模式。我不知道。我们陷入困境主要是因为我们想要正确命名我们的组件。 问题:是适配器模式吗?如果不是的话是什么?如果是其他事情,这是实现这个想法
我有点不熟悉Java KeyAdapter有效,并且使用 KeyAdapter 使用以下代码得到了意想不到的结果。当按下一个键而另一个键已按下时,就会出现此问题,无论 isKeyPressed() 是
我想知道如何通过 ORM 适配器使用 Node.js 在 MySQL 中创建多个表。我通过模型创建了一个表,即“us.js” module.exports = { identity: 'us'
我有一个 JavaFx 客户端。我正在使用一个具有 ObservableSet 作为字段的 bean 作为模型。我想将这些数据显示到 ListView 中,但我无法将我的字段类型更改为 Observa
我正在尝试在 native iOS 应用程序中实现基于表单的身份验证,但我需要在没有收到质询的情况下登录,我想打开一个表单并登录。我实现了一个包含 isCustomResponse 函数的 Chall
我正在尝试为我的迭代器和 const_iterator 类实现反向迭代器适配器,但遇到了一些麻烦。如果有人可以指导我解决这个问题,将不胜感激! 我的想法是我应该能够从我的 rbegin() 和 ren
使用 spring-integration-sftp,创建任意数量的入站 channel 适配器对象的推荐方法是什么?我的应用程序需要监视多个远程目录(1 到 n),直到运行时才知道。 最佳答案 当前
我正在尝试为我们自己的框架创建适配器。我们的框架使用自己的断言机制,因此我需要编写适配器。 适配器类非常简单,如下所示: public class AllureReportListener {
有没有什么方法可以使用命令行而不是使用 Worklight 控制台来部署 Worklight 适配器? (因为我的 worklight 服务器安装在 WAS 上,wsadmin 命令或类似的命令...
我想构建自己的自定义 log4j(网络)适配器来解决我的问题 that I posted here. 我查看了 log4j 的文档,但看不到开发人员在哪里/是否讨论如何执行此操作。 有人能给我指出正确
我使用消息驱动 channel 适配器从 weblogic JMS 队列接收作为字符串的 xml 消息,然后将此消息传递到 spring 集成 channel 以存储到数据库中,转换为不同的 xml,
有没有什么方法可以使用命令行而不是使用 Worklight 控制台来部署 Worklight 适配器? (因为我的 worklight 服务器安装在 WAS 上,wsadmin 命令或类似的命令...
我试图为 Android 制作一个聊天应用程序,所以我使用了 RecyclerView 。我的适配器有问题,我的聊天室收到的 JSON 响应显示为空白。我的代码是否遗漏了某些内容? 这是我的适配器类
如果这是重复的,我提前道歉。我对 Android 开发还是新手,并尝试寻找解决方案,但找不到有效的解决方案。 我正在创建一个待办事项应用程序并在我的适配器中收到此错误。 java.lang.NullP
我是一名优秀的程序员,十分优秀!