您好,欢迎来到华佗养生网。
搜索
您的当前位置:首页适配器模式及其应用

适配器模式及其应用

来源:华佗养生网
维普资讯 http://www.cqvip.com Microcomputer Applications Vo1.23,No.7,2007 文章编号:1OO7—757X(2007)07--OO59一O3 学习园地 微型电脑应用 2007年第23卷第7期 适配器模式及其应用 鲁 江,夏雨人 摘 要:本文先介绍了设计模式的概念,重要性。然后通过实例讲述如何在Delphi程序设计中应用适配器模式来提高应用程 序的可维护性。 关键词:设计模式;适配器模式;Delphi 中图分类号:TP311 文献标识码:A I 引言 面向对象的程序设计(OOP)是在软件工业中被视为重要 典范,享誉最久的一种设计思想。它对于现在的软件工程师 来说已经是一项不可或缺的基本技能。OOP之所以受到如此 欢迎的一个重要原因就在于它可以让开发人员在不同的项目 大量的代码修改和测试工作,同时由于程序已经发布给客 户,这可能导致客户端的程序无法运行。第二种方法就是使 用下面将要介绍的Adapter.模式,将新的控件类适配到老的 接口中去。 3适配器模式(Adapter Pattern) 适配器模式是一种应用非常广泛的结构型设计模式。其 主要意图是:“将一种类的接口转换成另一种客户所希望的接 n 享代码,提高代码的重用率。但是在实践过程中,我们却 总是遇到“重新发明轮子”的老问题。如何提高程序设计的 效率,利用以往成功案例的经验呢?这就要用到现在软件设计 中的另一个重要的概念:设计模式(Design Patterns)。 什么是设计模式昵?在GOF的《设计模式》一书中是这样 定义的:“对被用来在特定场景下解决一般设计问题的类和 ” ¨ 口。Adapter模式使得原本因接口不兼容而无法一起工作的 类可以在一起工作。”GOF将适配器模式又细分为类适配器 - (通过继承或多重继承来对一个接口与另一个接口匹配)和对 _ 相互通信的对象的描述。”每个设计模式都集中于一个特定 的面向对象设计问题或设计要点,描述了在什么时候,什么条 件下使用它。因为这些设计模式都是从大量的成功设计实践 中总结,提炼出来的通用设计结构,所以只要我们在设计过 象适配器(通过对象组合来实现)。本文仅对对象适配器进行 Ⅳ , 讨论。 以下是对象适配器模式的结构图:(图1) 程中善于运用这些设计模式,这将会使我们的程序具有良好 的可复用性和可扩展性。 下面就自己在设计实践中对适配器模式(Adapter Pat— tern)的理解,介绍一下该模式,并举例演示其在Delphi程序 设计中的应用。 ^‘{“nl‘- ^【j}Itll【 kl・‘川 t( 、j、I・l{1 l k‘,ul_ 2问题的提出 在程序设计过程中,常常遇到这样的问题:原本在一个程 、Ctl舯t・nl} duptI・I_ Sp ‘il ll H‘ l|t t{) 图1 序中使用的控件,过要改为其它的,或相似但功能更强,更完 从图中我们可以看出适配器模式涉及到四种角色 1.Target(已发布的接口)一一定义Cli ent使用的与特定 领域相关的接口 2.Client(使用已发布接口的部件)一一与和Target接口 一善的控件。例如:原先使用MSCOMM32.OOCX的通信程序, 现在要改为Delphi的VCL控件;原先制作压缩文件时使用 Zlib压缩算法(Delphi中安装的第三方控件),现在想要改为 ZIP的格式;等等诸如此类的问题。对于这些问题,一般可以 有两种解决方法。第一种方法:将已经建立的程序源代码全 致的对象合作 3.Adaptee(新增加的功能)一一定义一个已经存在的接 口,而这个接口需要适配 部改写,用新的控件类来替换源代码中老的控件类。这将导致 作者简介:鲁江,上海交通大学计算机科学与工程系,硕士研究生,上海200030 夏雨人,上海交通大学计算机科学与工程系,教授,上海200030 ・59・ 维普资讯 http://www.cqvip.com Microcomputer Applications Vo1.23,No.7,2007 学习园地 微型电脑应用 2007年第23卷第7期 4.Adapter一一对.Adalptee接口与Target接口进行适 配的类 Procedure TPoint.Display 0 Begin End: 那么什么时候我们需要适配器模式呢?当出现以下情况 时我们应该想到使用适配器模式 1.当你想使用一个已经存在的类,而它的接口不符合你 的需求时。一个典型的例子就是当你引入一个VBX和OCX 到Delphi中时,Delphi将产生一个新的类将这些外部控件的 //Point的Displayt)实现代码 Procedure TPoint.Fi 11() Begin End 接口转换成为一个同Object Pascal兼容的接口。 2.你想创建一个可以复用的类,该类可以同其他不相干 的类或不可预见的类协同工作。 //Point的Fill()实现代码 Procedure TLine.Di splay 0 egin BEnd 3.你想使用一些已经存在的子类,但是不可能对每一个 都进行子类化以匹配它们的接口。对象适配器可以适配它的 父类接口。 //Line的Display0实现代码 Procedure TLine.Fi 11 0: 4应用实例演示实现过程 假设我们现在有一些已经存在的类:点(Point),线 (Line),矩形(Square);它们具有一些行为如显示(Display), egiBn //Line的Fi n 1)实现代码 End: 现在假设我们需要实现一个圆(Circle),它将提供Display 0和F|1 l()行为。为了实现这个需求,我们可以通过编写一 填充(Fil1)。另外还存在一个类:圆(Circle);它也具有一些同 上述的类类似的行为如显示(Diaplaylt),填充(Fi 11 It)。我们 想要创建一个可以复用的类,例如Shape,它将提供一个接口 给客户,使得客户无需知道具体的类别,只需使用相同的方 法来处理具体的类。而且这个类Shape将来还可以增加其他 的具体类别,但这不能影响客户端的对象。 对于上述实例,我们可以创建一个抽象类Shape,它只定 义了这些行为的接口,具体的行为交给Shape的子类来实现。 下面是Shape类的定义: TShape=class Publ ic. 个Shape的新子类(这样我们就可以利用Shape的多态特性, 客户端只需访问Shape提供的接口)。然后再编码实现Di splay 0和Fil l()行为。但这样我们可能会要编写大量的代码。现在 我们已经有一个Ci re le类,它已经实现了我们需要的功能, 但是其不是Shape类的子类,无法利刚Shape提供的多态特 性,使客户端只需访问Shape提供的接口。为了利用现有的 Circ .e类,我们可以实现一个Shape类的子类CircleAdapter 类,Ni,一t适配器模式将Circle类包装一下,使之适应Shape 提供的接口。下面是Circle类,CircleAdapter类的定义: TCircler—class PubliC Procedure DisDlay():virtual:abstract: End Procedure Displaylt() Procedure Displaylt() Procedure Fillit() Procedure Fi l 1():virtual:abstract: 为了在Poi nt类,Line类中实现Shape类定义的行为,我 们定义Poj nt,Li ne为Shape的子类,让这些子类来实现Di splay 0,Fi l1()的具体行为。其定义如下: TPoint—C lass(TShape) PubliC End |i t End: TCircleAdapter=class(TShape) Private FCircle:TCircle Public Procedure Display():override: Procedure Fill 0:override: Constructor Create(PCircle:TCircle) Procedure Display 0 TLine—Class(TShape PubliC Procedure Display 0:override: Procedure Fi 11 0:override: End: Procedm’e Fil 1() i j.’・ End: TCircleAdapter类的实现代码: Procedure TCirc leAdapter.Create(PCirc J e..TCirc le): ・60・ 以下代码是Display(),Fill 0行为的实现: 维普资讯 http://www.cqvip.com Microcomputer Applications Vo1.23,No.7,2007 Begin 学习园地 微型电脑应用 2007年第23卷第7期 从上述代码可以看出我们只用了少量的代码就实现了Circle 类的复用,并且客户端的程序一点也不用变动。图二是上述 代码UML的类图表示。 End Inherited Create: FCircle:一PCircle: //…其他的初始化代码 Procedure TCirc leAdapter.Display(): Begin 5结束语 适配器模式虽然是一个很常用,也比较简单的模式,但通 过适配器模式能够让我们从接口的角度来考虑设计问题。它 集中体现了面向对象设计的原则之一:针对接口编程,而不是 End: FCircle.DisplayIt(): Procedure TCirc leAdapter.Fill() 针对实现编程。同时适配器模式也是对“开一闭”原则(即对扩 展的开发,对修改的关闭)的具体实现。设计模式为软件设计 人员提供了一种提高软件系统可靠性,可维护性以及可重用 性的设计思想,我们应该在设计过程中自觉运用这一思想,这 样才能是我们从一个只知写代码的软件技工成长为一名软件 C…j 0^d“pI 系统设计师。 OI 一^,{j II1(1 0I 8pl舳( II1¨ Di nIl () 参考文献: lJj Pl dy¨ bI1 I1 J spl { ¨jj【)c.1ll FIjIltf [1 1Erich Gamma,Richard Helm,Ralph Johnson,等著.李英 图2 egin B军,等译设计模式[M1北京,机械工业出版社,2000年 [2]Charlie Calvert著,潇湘工作室译.Delphi 4编程技术内幕 [M1.北京,机械工业出版社,1999年 [33阎宏著.Java与模式[M].北京,电子工业出版社,2002年 (收稿日期:2006~12—13) FCircle.FillIt(): End: 三彗 £ 强 P 妒 竖 £ 龌 3 曩 :莹 至 三 鱼 q ‘ 匠 鎏 : (上接第5O页) 个数据对象的数据结构,解决了信息标准化的问题。 通过在三层B/S模型使用XML,使得企业之间可以通过 DOM实际上是一个应用编程接口(API),用来定义一种 标准方法。通过这种方法,能够处理XML结构树的元素。对象 模式控制着使用者如何同结构树交流,并且把所有树的元素 作为对象暴露出来 DOM用扩展方式支持名域、数据类型、查 询和XSL转化。 网络,与合作伙伴问进行跨平台、跨操作系统的信息交换。 参考文献: [1][美]Didier Martih et a1.XML高级编程[MI.李吉吉,严 4结束语 春莹,等.北京:机械工业出版社,2001 [21[ ̄]Natanya Pitts et a1.XML技术内幕[M].许晓梅,等. 在基于XML的三层B/s模型中,中间层一次性从远程异 构数据库中获取满足客户需求的信息,生成相应的xML文 北京:机械工业出版社.2002.1 [3]刘芳珠,等.基于三层网络架构及D0M的xML系统模型 档,丰富的XML数据发送给客户端后,客户应用和脚本语言 [J].小型微型计算机系统,2001,22(12) 就可以直接使用这些数据,而且,无需刷新整个用户界面就可 以更新页面的内容,这样就减少了从服务器方获取客户方已 有的信息所需的交互时间。用户可以方便的远程管理数据,使 得网络成为一种具有更大的交互性和互操作性的媒体。其次, 运用基于XMI 的三层B/S模型,XML结构化的数据可以从 商业规范和表现形式中分离出来,而且可以更详细地定义某 [4]Hiroshi Maruyama,Kent Tamura,Naohiko Uramoto.XM— LandJavaDeveloping WebApplications[M].Addison-- Wesley.August 1999. [51王海波,耿晖等,基于XML的数据交换的实现[J1计算机 应用.2001,4。 (收稿日期:2006—09—14) ・61・ 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo7.cn 版权所有 湘ICP备2022005869号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务