历史上的今天
返回首页

历史上的今天

今天是:2025年01月15日(星期三)

正在发生

2018年01月15日 | 适配器模式和装饰模式的区别

2018-01-15 来源:互联网

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。


23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。


装饰模式的特点


1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。


2) 装饰对象包含一个真实对象的引用(reference)


3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。


4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

适配器模式


在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。


将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four


基本概念


客户:需要调用我们的代码的对象。


Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。


主要内容


(1)类适配器:


当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。


下面是类适配器的UML图:


(2)对象适配器:对象适配器”通过组合除了满足“用户期待接口”还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。下面是对象适配器的UML图:(3) 缺省适配器模式:缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是“平庸”的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。


装饰模式与适配器模式的的区别


装饰模式和适配器模式都有一个别名叫包装模式,但包装的形式是不一样的。


定义上:


装饰模式:对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。使用原来被装饰的类的一个子类的实例,把客户端的调用委派到被装饰类。


适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。


从定义上看装饰模式是对核心对象或者功能的扩展,适配器模式是把对象或者功能放到一个新对象中引用。举个例子,现在书城卖道德经的书,有线装版,有精装版,有日文版,有英文版,其中线装版和精装版就是装饰模式,日文版和英文版就是适配器模式,各种版本都是为迎合不同消费者的不同需求。为什么呢?因为线装版和精装版的道德经虽然包装不同,但内容相同,日文版和英文版就不同,这两个版本的内容就可能和原版的不同,文化差异嘛,翻译的内容虽来自道德经,但根据不同国家的文化,思维逻辑什么的就可能改变一些想法。


使用条件:


装饰模式一般在下列情况使用:需要扩展一个类的功能或者给你个类增加附加责任;需要动态的给一个对象增加功能,这些功能可以再动态的撤销;需要增加有一些基本功能的排列组合而产生非常大量的功能,从而使得继承关系变得不现实。


适配器模式一般使用的情况包括:系统需要使用现有的类,但此类已经不符合系统的需要;


想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的的类一起工作。适配器模式在系统升级的时候使用的频率很高,对旧系统的一些功能方法在新系统中引用。


Java中的应用:


装饰模式和适配器模式在java中的I/O文件的操作中都有体现。


Java的IO库中处理流的类有FIleInputStream,FileOutputStream,DataInputStream,DataOutputStream类等。在InputStream,OutputStream,Reader,Writer结构的内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的,改善的流处理器。这就体现了装饰模式的作用。同时在一些流处理器的内部有对其他流处理器的功能的适配引用,这体现了适配器模式的优点。


模式概念的出现,完善到合理应用是前辈们在实际的应用中不断总结的结晶。对于不同的需求合理的使用模式能起到事半功倍的效果,但是模式不是放之四海而皆准的,况且模式也不是一成不变死板的,随着技术的发展,工程师的智慧总结,可能会有新的模式出现和旧的模式的消亡,模式就是为实际需要而生,没必要上升到哲学这种高度。

推荐阅读

史海拾趣

Dfx公司的发展小趣事

随着智能家居市场的不断发展,某智能家居企业面临着如何将各种智能设备无缝连接、实现高效协同的挑战。通过引入DFX的设计理念,该企业成功实现了智能家居产品的标准化、模块化和可扩展性设计。这种设计方式使得不同设备之间可以方便地进行连接和通信,提高了系统的整体性能和用户体验。同时,该企业还通过优化生产流程和加强质量控制等手段,确保了产品的稳定性和可靠性。

这些故事虽然基于虚构的情境,但融入了电子行业中常见的实际问题和发展趋势。通过引入DFX的设计理念,这些企业成功解决了面临的挑战,提升了产品竞争力并赢得了市场的认可。

GaN Systems公司的发展小趣事

随着市场的不断拓展和技术的不断进步,GAIA盖亚电源持续加大研发投入,致力于技术创新和产品升级。公司拥有一支由超过300名工程师组成的研发团队,他们紧密关注行业动态,积极应对新技术和市场趋势。每年,GAIA盖亚电源都会推出数百种新产品,以满足不同客户的需求。这些新产品不仅涵盖了更广泛的电压范围和输出功率,还集成了最新的滤波、网络调节等先进技术,进一步提升了产品的性能和可靠性。

Econais公司的发展小趣事

随着技术的不断成熟和市场的日益扩大,Econais开始将目光投向全球市场。公司积极参加各类国际展会和研讨会,与全球各地的客户和合作伙伴建立联系。同时,Econais还针对不同地区的市场需求,推出定制化的产品和解决方案。这些努力使得Econais在全球范围内的市场份额逐渐扩大。

Calex Mfg Co Inc公司的发展小趣事

Calex Mfg. Co., Inc.的创业之路并非一帆风顺。在创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,公司的创始人们凭借着对电子行业的热爱和对技术的深刻理解,坚持研发创新,不断推出符合市场需求的产品。他们通过精益求精的制造工艺和严格的质量控制,逐渐在市场中树立起了良好的口碑。

CETC公司的发展小趣事

CETC深知人才是企业发展的根本。因此,公司一直注重人才培养和团队建设。公司设立了完善的培训体系,为员工提供各种学习和发展的机会。同时,CETC还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队在公司的各个领域都发挥着重要作用,为公司的持续创新和发展提供了有力保障。

BREL International Components公司的发展小趣事

随着环保意识的日益增强,BREL International Components公司积极响应绿色发展的号召。公司投入大量资源研发环保型电子元件,采用环保材料和节能技术,降低产品对环境的影响。同时,BREL还加强废弃电子元件的回收和处理工作,推动电子行业的可持续发展。这种环保理念不仅提升了BREL的企业形象,也为公司的未来发展奠定了坚实的基础。

请注意,这些故事是基于虚构的,旨在展示电子行业常见的发展路径和策略,而非针对具体公司的描述。如果您需要关于特定公司的故事或信息,建议您直接查阅该公司的官方网站或相关新闻报道。

问答坊 | AI 解惑

用7905怎么设计-5负电源

本帖最后由 paulhyde 于 2014-9-15 09:48 编辑 用7905怎么设计-5负电源的原理图是怎样的啊????? 大哥们帮帮忙!!!  …

查看全部问答>

招聘硬件开发工程师

本公司提供良好发展机会和平台 我公司是一家主营一卡通智能管理系统、智能卡机具、热工仪表三大类产品,集研发、生产、销售、工程安装维护等全套工程实施,具有雄厚技术、销售实力的民营企业。 公司于2003年11月取得ISO9001认证;2005年8月,被杭 ...…

查看全部问答>

i2c总线协议(中文版)

i2c总线协议(中文版)相关说明…

查看全部问答>

ARM,DSP,FPGA,CPLD,SOPC,SOC之间的联系和区别

arm是一种嵌入式芯片,比单片机功能强,可以针对需要增加外设。类似于通用cpu,但是不包括桌面计算机。 DSP主要用来计算,计算功能很强悍,一般嵌入式芯片用来控制,而DSP用来计算,譬如一般手机有一个arm芯片,主要用来跑界面,应用程序,DSP可能 ...…

查看全部问答>

那里可以获得STM32F103的JTAG接口的资料啊?

                                 请问一下,那位知道在那里可以获得STM32F103的JTAG接口的资料呢?…

查看全部问答>

求教:捕捉不稳定的问题怎么解决!!

用DSP2812的捕捉口来捕捉过零点检测,但是捕捉到的脉冲信号不稳定,过零点后的脉冲方波已经加了低通滤波器和施密特触发器了,但是DSP捕捉到的信号仍不稳定怎么办啊!!!…

查看全部问答>

希望单片机高手帮忙看下这款单片机的型号是什么?

下面是单片机的引脚截图,没有型号,希望单片机高手能帮忙识别下单片机是什么型号的,万分感谢!!…

查看全部问答>

求助电容传感器问题

请问各位大神,谁做过关于电容称重传感器方面的项目,小弟想咨询一些问题…

查看全部问答>

stm32定义新变量影响da

现在程序中(程序下载到stm32 vct6中)定义一个新变量但不使用,DA(DA控制机床主轴)就没有输出了,可是在线调试的时候,那段代码都正常走的啊,但主轴就是不转 。 请问各路大神,这究竟是哪里出了问题啊 …

查看全部问答>

请教高手:做51格力空调遥控器,解了码后不知为何空调没反应,附程序如下。

#include #define uchar unsigned char #define uint unsigned int sbit   output = P1^0; sbit KEY1=P3^0; sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; static bit OP;        //红外发射 ...…

查看全部问答>