- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
结构型模式篇,结构型模式,设计模式结构型模式,新型组织结构模式,人体内脏结构模式图女,人体内脏结构模式图,结构模式识别,议论文结构模式,女性内脏结构模式图,议论文的结构模式
适配器模式(Adapter Pattern ) ——.NET 设计模式系列之八 Terrylee,2006 年 2 月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应
用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如
何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的
Adapter 模式。 意图 将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容
而不能一起工作的那些类可以一起工作。 结构图 图 1 类的 Adapter 模式结构图 图 2 对象的 Adapter 模式结构图 生活中的例子 适配器模式允许将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容
而不能一起工作的类可以一起工作。扳手提供了一个适配器的例子。一个孔套在棘齿上,棘齿的
每个边的尺寸是相同的。在美国典型的边长为 1/2和 1/4。显然,如果不使用一个适配器的
话,1/2的棘齿不能适合 1/4的孔。一个 1/2至 1/4的适配器具有一个 1/2的阴槽来套
上一个 1/2的齿,同时有一个 1/4 的阳槽来卡入 1/4的扳手。 图 3 使用扳手适配器例子的适配器对象图 适配器模式解说 我们还是以日志记录程序为例子说明 Adapter 模式。现在有这样一个场景:假设我们在软
件开发中要使用一个第三方的日志记录工具,该日志记录工具支持数据库日志记录 DatabaseLog
和文本文件记录 FileLog 两种方式,它提供给我们的 API 接口是 Write 方法,使用方法如下: Log.Write Logging Message! ; 当软件系统开发进行到一半时,处于某种原因不能继续使用该日志记录工具了,需要采用
另外一个日志记录工具,它同样也支持数据库日志记录 DatabaseLog 和文本文件记录 FileLog
两种方式,只不过它提供给我们的 API 接口是 WriteLog 方法,使用方法如下: Log.WriteLog Logging Message! ; 该日志记录工具的类结构图如下: 图4 日志记录工具类结构图
它的实现代码如下:
public abstract class LogAdaptee public abstract void WriteLog ; public class DatabaseLog:LogAdaptee public override void WriteLog Console.WriteLine Called WriteLog Method ; public class FileLog:LogAdaptee public override void WriteLog Console.WriteLine Called WriteLog Method ; 在我们开发完成的应用程序中日志记录接口中(不妨称之为 ILogTarget 接口,在本例中为
了更加清楚地说明,在命名上采用了Adapter 模式中的相关角色名字),却用到了大量的 Write 方法,程序已经全部通过了测试,我们不能去修改该接口。代码如下: public interface ILogTarget void Write ; 这时也许我们会想到修改现在的日志记录工具的 API 接口,但是由于版权等原因我们不能
够修改它的源代码,此时 Adapter 模式便可以派上用场了。下面我们通过 Adapter 模式来使得该
日志记录工具能够符合我们当前的需求。 前面说过,Adapter 模式有两种实现形式的实现结构,首先来看一下类适配器如何实现。
现在唯一可行的办法就是在程序中引入新的类型,让它去继承 LogAdaptee 类,同时又实现已有
的 ILogTarget 接口。由于 LogAdaptee 有两种类型的方式,自然我们要引入两个分别为 Databas
eLogAdapter 和 FileLogAdapter 的类。 图 5 引入类适配器后的结构图 实现代码如下: public class DatabaseLogAdapter:DatabaseLog,ILogTarget public void Write WriteLog ; public class FileLogAdapter:FileLog,ILogTarget public void Write this.WriteLog ; 这里需要注意的一点是我们为每一种日志记录方式都编写了它的适配类,那为什么不能为
抽象类 LogAdaptee 来编写一个适配类呢?因为 DatabaseLog 和 File
文档评论(0)