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

合集下载

通过代码示例跟我学GOF 设计模式的设计思想——面向接口编程实现

通过代码示例跟我学GOF 设计模式的设计思想——面向接口编程实现

1.1通过代码示例跟我学GOF 设计模式的设计思想——面向接口编程实现1.1.1在数据库连接组件中应用面向接口编程实现1、设计数据库连接组件对外的接口(1)为什么要应用接口?如何实现接口?1)应用接口编程实现的最主要的目的是达到分离“分析设计”和“功能实现”并最终达到有助于“满足变化”的应用目的;2)其次,约束不同的功能实现程序,必须要提供并实现在接口中所提出的各种功能要求;3)有助于团队开发中的模块分工,协作开发——两个模块通过接口互联,其一为接口的使用者,另一个为接口的功能实现者,当然还有接口的制定者(一般为设计师)。

通过这个接口,调用者无须知道目标对象的具体详细信息,只需要知道它实现了这个接口,那么它便可以依据这个接口来使用这个对象了。

接口的实现者按照接口的制定者的设计要求完成相关的功能实现。

因此,接口本质上就是由制定者来协调实现者和调用者之间的关系。

当然,也只有接口的实现者和接口的调用者都遵循“面向接口编程”这个准则后,制定者的协调目的才能达到。

(2)如何实现接口?为了能够实现接口,需要通过相关的功能类实现,并在实现类重写接口中的所有的成员方法。

2、在项目中添加一个数据库连接的接口接口的名称为ConnectDBInterface,包名称为com.px1987.webbank.dao.inter,如下为实现的示图截图:3、设计该接口中的功能方法方法4、ConnectDBInterface接口的代码示例package com.px1987.webbank.dao.inter;import java.sql.Connection;import com.px1987.webbank.exception.*;public interface ConnectDBInterface {public Connection getConnection() throws WebBankException;public void closeDBCon() throws WebBankException;public boolean isDBConnectionClose();}5、为ConnectDBInterface接口添加相关的实现类由于接口本身只是定义了相关的功能方法,并没有给出具体的功能,因此需要为上面的ConnectDBInterface接口提供对应的功能实现类。

UML-GoF设计模式

UML-GoF设计模式

UML-GoF设计模式我认为,本章是重点中的重点。

并⾮23个模式都被⼴泛应⽤,其中常⽤和最为有效的⼤概有15个模式。

1、适配器(Adapter)1)、使⽤场景使⽤⼀个已经存在的类,但如果他的接⼝,也就是他的⽅法和你的要求不相同时,考虑使⽤是适配器模式。

就是说,双⽅都不修改⾃⼰的代码的时候,可以采⽤适配器模式。

2)、结构图3)、相关模式外观对象:隐藏外部系统的资源适配器也被视为外观对象,因为资源适配器使⽤单⼀对象封装了对⼦系统或系统的访问。

资源适配器:当包装对象时为不同外部接⼝提供适配时,该对象叫资源适配器4)、准则类名后缀为“Adapter”。

5)、⽤到的GRASP原则2、⼯⼚模式1)、使⽤场景该模式也常称为“简单⼯⼚”或“具体⼯⼚”。

如:1)、存在复杂创建逻辑2)、为提⾼内聚⽽分离创建者职责(关注点分离)因此,创建称为⼯⼚的纯虚构对象来处理这些创建职责。

2)、结构⼀般xxxFactory应该是单实例类。

3)、相关模式通常使⽤单例模式来访问⼯⼚模式。

由谁创建⼯⼚呢?⼀般采⽤单例模式。

3、单例模式1)、使⽤场景只有唯⼀实例的类即为“单实例类”。

对象需要全局可见性和单点访问。

因此,建议对类定义静态⽅法⽤以返回单实例。

2)、相关模式单例模式:通常⽤于创建⼯⼚对象和外观对象以上整合例⼦:4、策略模式1)、使⽤场景销售的定价策略(也可叫做规则、政策或算法)具有多样性。

在⼀段时间内,对于所有的销售可能会有10%的折扣,后期可能会对超出200元的销售给予10%的折扣,并且还会存在其他⼤量的变化。

因此,在单独的类中分别定义每种策略/规则/政策/算法,并且使其具有共同接⼝。

2 )、结构策略模式,共同的⽅法内传⼊的参数,通常是上下⽂对象,上图就是sale。

3)、结合⼯⼚模式1)、使⽤⼯⼚模式创建这些策略类2)、使⽤单例模式创建⼯⼚类。

5、组合模式1)、使⽤场景如果有重叠怎么办?⽐如:1)⽼年⼈折扣20%2)购物⾦额满200元享受15%折扣因此,如何能够处理像原⼦对象⼀样,(多态的)处理⼀组对象或具有组合结构的对象呢?答:定义组合和原⼦对象的类,使他们具有相同的接⼝。

跟我学GOF程序代码编程中的各种设计模式——变压器(适配器)设计模式

跟我学GOF程序代码编程中的各种设计模式——变压器(适配器)设计模式

1.1跟我学GOF程序代码编程中的各种设计模式——变压器(适配器)设计模式1.1.1变压器(适配器)模式1、为什么要提供变压器(适配器)模式在系统之间集成的时候,最常见的问题是接口不一致,很多能满足功能的软件模块,由于接口不同,而导致无法使用。

比如,我们最常见的媒体播放器MS Media Player以及RealPlay,它们的接口完全不同,前者支持WMF格式的音频和视频,后者支持RM格式的音频和视频。

如果我们希望自己的系统能用相同的方式支持这两种播放器,就需要想一些办法。

2、变压器(适配器)模式适配器模式把一个类的接口变换成客户端所期待的另一种接口。

变压器模式使原本无法在一起工作的两个类能够在一起工作。

变压器模式是关于类结构的结构性模式,因而是静态的模式。

这很象变压器(Adapter)——变压器把一种电压变换成另一种电压。

当把美国的电器拿回中国大陆去用的时候,就面临电压不同的问题。

美国的生活用电压是110伏,而中国的电压是220伏。

如果要在中国大陆使用在美国使用的电器,就必须有一个能把220伏电压转换成110伏电压的变压器。

而这正象是本模式所做的事,因此此模式被称为变压器模式。

同时在遍程中也普遍采用适配器模式,比如有一个接口,声明了三个抽象个方法,使用这个接口就必须实现这三个方法,缺一不可,有时候我们只需要应用其中的一两个方法,这就使开发非常繁琐,但我们可以建立一个适配器类,里面以空方法实现了这三个方法,使用者只需要继承这个适配器类,覆盖所需要的方法就可以了。

可以看出来,只有一个实现WriteTextEvent()的Client类原本不能使用Listener interface,但通过Adapter类就可以使用了,这时一个非常简单单也是非常常用的使用适配器模式的情况,在Java的事件编程中经常使用。

3、在变压器(适配器)模式中所涉及的成员(1)主要的成员1)目标(Target):这就是我们所期待得到的接口。

php教程 php设计模式介绍之适配器模式

php教程 php设计模式介绍之适配器模式

php教程php设计模式介绍之适配器模式接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。

程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化。

我孩子的无数玩具中有一个简要地描述了这个两难局面:你无法合理安排一个不得其所的人。

问题你如何避免因外部库的API改变而带来的不便?假如你写了一个库,你能否提供一种方法允许你软件的现有用户进行完美地升级,即使你已经改变了你的API?为了更好地适宜于你的需要,你应该如何改变一个对象的接口?解决方案适配器(Adapter)模式为对象提供了一种完全不同的接口。

你可以运用适配器(Adapter)来实现一个不同的类的常见接口,同时避免了因升级和拆解客户代码所引起的纠纷。

考虑一下当(不是假设!)一个第三方库的API改变将会发生什么。

过去你只能是咬紧牙关修改所有的客户代码,而情况往往还不那么简单。

你可能正从事一项新的项目,它要用到新版本的库所带来的特性,但你已经拥有许多旧的应用程序,并且它们与以前旧版本的库交互运行地很好。

你将无法证明这些新特性的利用价值,如果这次升级意味着将要涉及到其它应用程序的客户代码。

注:控制体模式适配器(Adapter)模式是控制体模式的最新范例。

一个适配器(Adapter)的结构类似于代理服务器(Proxy)和修饰器(Decorator),而它们的不同之处在于,适配器(Adapter)的目的是改变封装类的接口,代理服务器(Proxy)和修饰器(Decorator)则是保持接口不变。

样本代码让我们看看当API改变时,如何保护应用程序不受影响。

假设你费尽心思寻找合适的库,最后终于找到了HwLib,一个(假设的)被设计用来发送信息的代码集。

下面是HwLib类的源代码:// PHP4/*** the HwLib helps programmers everywhere write their first program* @package HelloWorld* @version 1*/class HwLib {/*** Say “Hello”* @deprec this function is going away in the future* @return string*/function hello() {return …Hello …;}/*** target audience* @return string*/function world() {return …World!‟;}}下面是库运行的范例:$hw =& new HwLib;echo $hw->hello(), $hw->world();HwLib有完备的说明文档。

应用适配器模式实现通用的数据库访问的程序代码示例

应用适配器模式实现通用的数据库访问的程序代码示例
由于适配器提供了一种“转换”,使得可以复用一个接口不再符合目前应用需求的已存 在的功能类,也可以使一个程序类在发生不可预见的变化时,仅仅影响适配器程序类本身 而不影响使用适配器程序类的不同的客户端程序类——将分散的或者发散的可变性集中在 某处,有利于程序代码的维护修改。
杨教授大学堂,版权所有,盗版必究。 1/16 页
总体对象内组合多个不同的其它对象。因此,对象适配器可以适配多个不同的原有系统中 的组件接口——从而达到将多个不同的接口统一转换调配为一个共同的接口。下面的示图
杨教授大学堂,版权所有,盗版必究。 3/16 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
为应用对象适配器转换调配多个不同的功能接口的程序类示图。
象”的接口(ObjectDAO)以及它的实现类(ObjectDAOImpl),由于是对 Object 进行操作, 所以任何具体的类(如 Student,,Teacher,User 等)对它都可以适用,下面为接口及对应 的实现类的代码示例。 (1)ObjectDAO 接口及相关的方法的代码示例 import java.util.List; public interface ObjectDAO {
分方法:
(4)类适配器的应用场合 由于适配器类不仅继承了被适配的某个程序类,同时又实现了需要匹配转换的目标接
口。因此,在适配器程序类中可以访问被适配的某个程序类和目标接口,从而承担起“转 换”的功能。
但这种方式当所应用的语言不支持多重继承的时候(比如 Java 语言)而又需要适配多 个不同的被适配的程序类时,则无法应用该方法。这时可以使用下面将要介绍的对象适配 器。 3、对象适配器的程序结构及应用场合 (1)对象适配器的程序结构
因此,对象适配器可以应用于对多个不同的功能类的“适配”功能,可以弥补类适配 器在不支持多重继承的编程语言(如 Java、C#)的实现不足。 2、类适配器的程序结构及应用场合 (1)程序结构实现的要求

适配器模式的使用流程

适配器模式的使用流程

适配器模式的使用流程1. 什么是适配器模式?适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。

适配器模式可以让原本由于接口不兼容而不能一起工作的类能够合作无间。

2. 为什么要使用适配器模式?在软件开发中,经常会遇到以下情况:•已有的类不能满足新的接口要求。

•要使用的类与已有的其他类无法协同工作。

•想要创建一个可复用的类,可以与多个不兼容的类协同工作。

适配器模式提供了一种解决方案,通过适配器,将不兼容的类进行适配,使其能够协同工作。

3. 适配器模式的基本结构适配器模式包含以下几个基本元素:•目标接口(Target):定义客户端所期望的接口。

•适配者类(Adaptee):需要被适配的类。

•适配器类(Adapter):将适配者类转换成目标接口的类。

4. 如何使用适配器模式?使用适配器模式的基本流程如下:1.定义目标接口(Target)。

2.创建适配者类(Adaptee),该类包含一些需要被适配的方法。

3.创建适配器类(Adapter),实现目标接口,并在内部维护一个适配者对象。

4.在适配器类中实现目标接口的方法,通过调用适配者对象的方法来完成适配。

5.在客户端代码中,通过使用适配器类来调用目标接口的方法,实现对适配者类的使用。

5. 适配器模式的实例假设我们正在开发一个音乐播放器,需要支持多种格式的音频文件,包括MP3、WAV和FLAC。

现在我们已经有了一个已经实现了MP3播放的类MP3Player,但是我们的播放器需要支持所有三种格式的音频文件。

首先,我们定义目标接口AudioPlayer:•play(file: string): void:播放音频文件。

接下来,创建适配者类MP3Player:class MP3Player {playMP3(file: string): void {console.log(`播放MP3音频文件 ${file}`);}}然后,创建适配器类AudioPlayerAdapter,实现目标接口,并在内部维护一个MP3Player对象:class AudioPlayerAdapter implements AudioPlayer {private mp3Player: MP3Player;constructor() {this.mp3Player = new MP3Player();}play(file: string): void {this.mp3Player.playMP3(file);}}最后,在我们的音乐播放器中使用适配器模式:```typescript const audioPlayerAdapter = new AudioPlayerAdapter(); audioPlayerAdapter.play(。

PHP设计模式—适配器模式

PHP设计模式—适配器模式

PHP设计模式—适配器模式定义:适配器模式(Adapter):将⼀个类的接⼝转换成客户希望的另外⼀个接⼝。

Adapter 模式使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作。

结构:Target:⽬标接⼝,定义与客户端交互相关的接⼝,⽬标可以是具体的或抽象的类,也可以是接⼝。

Adaptee:源接⼝,需要适配的类。

Adapter:适配器,对 Adaptee 的接⼝与 Target 接⼝进⾏适配,通过在内部包装⼀个 Adaptee对象,把源接⼝转换成⽬标接⼝。

Client:客户端代码。

代码实例:类适配器:/*** Target.php(⽬标接⼝)* Interface Target*/interface Target{public function method1();public function method2();}/*** Adaptee.php(源接⼝)* Class Adaptee*/class Adaptee{public function method1(){echo "Adaptee Method1<br/>\n";}}/*** Adapter.php(适配器)* Class Adapter*/class Adapter extends Adaptee implements Target{public function method2(){// TODO: Implement method2() method.echo "Adapter Method2<br/>\n";}}// 客户端调⽤$adapter = new Adapter();$adapter->method1();$adapter->method2();对象适配器:/*** Target.php(⽬标接⼝)* Interface Target*/interface Target{public function method1();public function method2();}/*** Adaptee.php(源接⼝)* Class Adaptee*/class Adaptee{public function method1(){echo "Adaptee Method1<br/>\n";}}/*** Adapter.php(适配器)* Class Adapter*/class Adapter implements Target{private$adaptee;public function __construct(Adaptee $adaptee) {$this->adaptee = $adaptee;}public function method1(){// TODO: Implement method1() method.$this->adaptee->method1();}public function method2(){// TODO: Implement method2() method.echo "Adapter Method2<br/>\n";}}// 客户端调⽤$adapter = new Adapter(new Adaptee()); $adapter->method1();$adapter->method2();。

设计模式(OOD)学习

设计模式(OOD)学习

设计模式(OOD)学习设计模式(Object-Oriented Design Patterns)是在软件开发中用来解决经常出现的问题的一种经验总结和方法论。

设计模式通过提供一套经过验证的解决方案来帮助开发人员更高效地设计和组织代码。

本文将介绍设计模式的概念、常见的设计模式分类以及一些常用的设计模式示例。

设计模式的概念设计模式是一种软件设计中的抽象,它描述了解决常见问题的一种方法。

它们不是一种具体的算法或代码实现,而是一种在特定情况下可重复使用的解决方案。

设计模式的目标是提高代码的可重用性、可读性和可维护性。

常见的设计模式分类常见的设计模式可以根据其目标和应用场景进行分类。

以下是几个常见的设计模式分类:1. 创建型模式(Creational Patterns)创建型模式关注对象的实例化过程。

它们提供了一种将对象的创建和使用分离的方法,隐藏了对象的创建细节。

- 单例模式(Singleton Pattern):保证一个类只有一个实例,并提供全局访问点。

- 工厂模式(Factory Pattern):通过使用工厂方法来创建对象,而不是直接使用new操作符。

- 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。

- 原型模式(Prototype Pattern):通过克隆现有对象来创建新对象。

- 建造者模式(Builder Pattern):将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

2. 结构型模式(Structural Patterns)结构型模式关注类和对象的组合,通过定义对象之间的关系来实现更大的结构。

- 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另一个接口。

- 装饰器模式(Decorator Pattern):动态地将新功能添加到对象中。

- 代理模式(Proxy Pattern):为其他对象提供一个代理以控制对这个对象的访问。

  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和数据源之间的适配器)。

如java.awt.event程序包中包含有如下的适配器类:ComponentAdapter、ContainerAdapter、FocusAdapter、HierarchyBoundsAdapter、KeyAdapter、MouseAdapter、MouseMotionAdapter和WindowAdapter。

在J2EE Web组件中的Servlet类其实也应用了适配器模式——当然,它实质为缺省适配器模式。

主要的应用目的是简化对Servlet接口的实现。

因为正常的Servlet类需要实现Servlet接口,也就是要采用下面的类定义:public class MyServlet implements Servlet{}此时,在Servlet程序类中必须要重写Servlet接口中的所有方法,但在应用中可能并不需要Servlet 接口的所有方法而导致应用的复杂性——接口对接口的实现类具有强制性的要求。

为此,J2EE中提供有HttpServlet类,它实现了Servlet接口——该HttpServlet类其实就是适配器模式中的适配器类。

public class HttpServlet implements Servlet{}public class MyServlet extends HttpServlet{}下面通过一个具体的应用示例说明适配器模式能够简化对接口的实现。

6、利用适配器模式能够简化对接口的实现(1)没有采用适配器模式时的代码示例Java面向对象中的接口和接口的实现之间的基本要求,实现类必须要实现接口中的所有成员方法,“即使不用也得实现”。

下面为一个接口SomeOneInterface的定义,其中定义有三个成员方法:interface SomeOneInterface{public void firstMethod();public void secondMethod();public void thirdMethod();}而下面的SomeOneImple为接口SomeOneInterface的实现类,但根据应用的需要,该实现其实只需要应用thirdMethod方法;而其它的两个方法firstMethod和secondMethod并不需要,但也必须要进行实现——这就使开发者非常繁琐,不需要的功能方法也需要进行重写。

public class SomeOneImple implements SomeOneInterface{public void firstMethod(){}public void secondMethod(){}public void thirdMethod(){/**具体的功能实现的代码,在此省略*/}public static void main(String[]args){SomeOneInterface someOneObject=new SomeOneImple();someOneObject.thirdMethod();}}(2)采用适配器模式时的代码示例提供一个适配器类,该适配器类实现接口SomeOneInterface中的各个方法,但在该实现类中并不对接口进行实质性的功能实现——而是在其中以空方法实现原接口中的三个方法(该类为缺省适配器模式中的适配器类),如下为代码示例。

public abstract class SomeOneDefaultAdapter implements SomeOneInterface{public void firstMethod(){}public void secondMethod(){}public void thirdMethod(){}}注意:上面的SomeOneDefaultAdapter类可以设计为抽象类,也可以不设计为抽象类。

相关文档
最新文档