通过代码示例学习GOF 设计模式(第13章适配器模式)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前言

软件开发工作从本质上属于创造性的工作,它是一种将“软件产品”从无到有生的创建过程。行业内流行的“站在巨人的肩膀上”、“不要重复地发明轮子”、“不要不断地重复自己”等“名言警句”其实都是对“软件复用”思想的具体体现。

面向对象程序设计方法提供了类级别的重用;而基于“组件化”的复用方式,已使软件系统产品在质量保证、开发效率等方面得到了更大的提高;面向框架级的系统集成开发(如J2EE中的SSH、、PHP的LAMP等),不仅可以实现组件级别的重用,而且在系统的总体架构、软件设计思想等方面都可以得到重用。因此“面向对象”、“组件化”、“基于XML的数据结构描述”、“面向框架”等设计思想和实现技术,更使得软件系统的“复用”达到了一个更深的层次,随之而来的各种企业级“中间件组件”、AOP、SOA等技术的出现,也使得开发者的主要精力可以越来越多地关注于应用系统的业务逻辑和业务数据,而非系统“底层”的具体实现技术和各个不同技术平台之间、各个数据库系统之间的差异。

作者接触很多高校计算机软件专业类的教师和学生,深感目前的计算机软件开发类专业的程序设计类各个课程在教学方面的欠缺,不仅编码不规范(胡写代码和混乱命名)、技术深度不足(学C语言不学习指针、学Java不学习集合、反射和范型),而且程序代码还存在许多不可靠、性能低下、扩展性差等方面的问题;国内许多“小作坊”型的软件公司人员不断地生产出大量的“垃圾代码”,从而使得这些软件公司的项目都是“一次性买卖”,客户方受骗后再也没有第二次的项目开发。

作者根据自身多年的软件开发实践和经验总结,结合多年的IT职业培训的教学和高校软件学院一线的教学工作体验,在本系列文档中通过具体的程序代码示例为读者介绍GOF 设计模式及相关的应用技术。主要的目的是希望能够以成功的经验或者失败的教训为读者减少软件开发失败的风险,同时也为高校师生总结出如何能够编程开发出一个“易读的”、“易维护的”、“易扩展”、“高性能”和“可重用”的系统程序。

本文档主要涉及GoF适配器模式及应用、适配器模式主要技术特性和程序结构,适配器模式的应用示例、类适配器的应用示例、对象适配器的应用示例和如何应用适配器模式实现组合转换器的应用实例等方面的内容。

杨教授大学堂精心创作有系列化的优秀程序员职业提升必读技术资料,这些资料将系统地从软件设计和开发实现的“设计思想”、“管理策略”、“技术实现”和“经验方法”等方面与读者进行充分的交流,涉及作者对软件开发设计思想和原则、课程设计、项目实训、软件实现技术等方面的学习心得体会和应用技巧、经验总结。

本文目录

1.1GoF适配器模式及应用 (3)

1.1.1GoF适配器模式主要技术特性 (3)

1.1.2适配器模式的程序结构 (7)

1.2适配器模式的应用示例 (13)

1.2.1类适配器的应用示例 (13)

1.2.2对象适配器的应用示例 (22)

1.2.3应用适配器模式实现组合转换器的应用实例 (26)

1.1GoF适配器模式及应用

1.1.1GoF适配器模式主要技术特性

1、为什么要提供变压器(适配器,Adapter)模式

(1)在进行系统集成时经常遇到的问题是接口不一致——接口不匹配

很多能满足应用功能的软件系统中的功能模块,由于接口不同,而导致无法使用。比如,常见的媒体播放器软件有微软的Media Player和另一个媒体播放器软件RealNetworks公司的RealPlay。但由于它们的接口完全不同和主持不同的音频和视频格式——前者支持WMF格式的音频和视频,而后者支持RM格式的音频和视频。

(2)如何解决接口不匹配的问题

如果开发人员希望自己的应用系统中能使用相同的方式来支持这两种播放器,就需要提供一个相互“适配”的转换接口——也就是可以应用适配器模式解决这个问题。该适配器类可以将WMF格式的音频和视频转换为RM格式的音频和视频,从而可以重用RealPlay的媒体播放器软件;当然,该适配器类也可以将RM格式的音频和视频转换为WMF格式的音频和视频,从而可以重用Media Player的媒体播放器软件。

(3)什么是适配器模式

GOF在他们的设计模式一书中对适配器模式的描述如下:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

其实上面的定义核心思想:在新接口和老接口之间进行适配。

2、适配器模式的主要作用

(1)匹配不同接口的程序类

适配器模式可以使得原本由于接口不兼容而不能一起工作的类可以一起工作,通过提供适配器类可以实现将一种“接口”转换为另一种“接口”,以满足目标“接口”的应用要求和重用原有的功能实现的程序代码。

由于适配器提供了一种“转换”,使得可以复用一个接口不再符合目前应用需求的已存在的功能类,也可以使一个程序类在发生不可预见的变化时,仅仅影响适配器程序类本身而不影响使用适配器程序类的不同的客户端程序类——将分散的或者发散的可变性集中在某处,有利于程序代码的维护修改。(2)重用接口不匹配的现有程序类

实现将两个或者多个没有关系(或者不兼容)的类组合在一起使用,并向客户端提供一个新的统一的功能服务接口,从而达到重用接口不匹配的现有程序类的目标。

(3)重用接口不匹配的第三方的组件

在应用开发中,经常需要重用第三方的组件,但在应用中却发现该第三方组件的接口定义和自己应用中所需要的接口定义存在差别,但又不希望修改自己的功能接口和有必要使用第三方组件接口的功能方法。

3、如何实现将两个没有关系(或者不兼容)的程序类组合在一起使用

(1)第一种解决方案是修改各自类的接口

当然,修改各自类的接口在许多应用环境下可能无法实现——比如,如果没有相关的源代码或者不愿意为了一个应用而修改各自的接口。

(2)第二种解决方案则是使用适配器模式

在这两种接口之间创建一个混合接口,该混合接口也就是适配器模式中的适配器角色,从而转换和匹配不同类型的接口。

4、应用适配器模式的主要目的是达到能够适配两个不同形式的应用目标

适配器模式在具体实现时,可以达到适配两个不同形式的应用目标:转换器和组合器。

(1)转换器

适配器模式把一个类的接口变换成客户端所期待的另一种接口,此时的适配器类其实是一种转换器的角色。

(2)组合器

适配器模式使原本无法在一起工作的两个类能够在一起工作,此时的适配器类其实也就是一种组合转换器的角色。

5、适配器模式在GOF中属于结构型模式

(1)适配器模式很象生活中的变压器

变压器可以将一种电压变换成另一种电压——比如,把美国的电器拿到中国大陆使用时,就面临着工作电压不同的问题。因为美国的生活用电压是110伏,而中国的电压是220伏。如果要在中国大陆使用在美国使用的电器设备,就必须要有一个能把220伏电压转换成110伏电压的变压器。

生活中的手机电源充电器其实也是一个适配器的应用示例。

(2)J2SDK和J2EESDK API中都提供有许多的适配器类

在J2SE中的Swing GUI组件的事件编程中经常使用事件适配器,在Java SDK中提供有很多适配器类(其实在中也提供有许多的适配器类,比如中的DataAdapter,它就是用作DataSet

相关文档
最新文档