结构型设计模式

结构型设计模式

ID:33429831

大小:873.79 KB

页数:99页

时间:2019-02-25

结构型设计模式_第1页
结构型设计模式_第2页
结构型设计模式_第3页
结构型设计模式_第4页
结构型设计模式_第5页
资源描述:

《结构型设计模式》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、1.适配器模式(AdapterPattern)——.NET设计模式系列之八Terrylee,2006年2月概述在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter模式。意图将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。结

2、构图图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、的扳手。图3使用扳手适配器例子的适配器对象图适配器模式解说我们还是以日志记录程序为例子说明Adapter模式。现在有这样一个场景:假设我们在软件开发中要使用一个第三方的日志记录工具,该日志记录工具支持数据库日志记录DatabaseLog和文本文件记录FileLog两种方式,它提供给我们的API接口是Write()方法,使用方法如下:Log.Write("LoggingMessage!");当软件系统开发进行到一半时,处于某种原因不能继续使用该日志记录工具了,需要采用另外一个日志记录工具,它同样也支

4、持数据库日志记录DatabaseLog和文本文件记录FileLog两种方式,只不过它提供给我们的API接口是WriteLog()方法,使用方法如下:Log.WriteLog("LoggingMessage!");该日志记录工具的类结构图如下:图4日志记录工具类结构图它的实现代码如下:publicabstractclassLogAdaptee{publicabstractvoidWriteLog();}publicclassDatabaseLog:LogAdaptee{publicoverridev

5、oidWriteLog(){Console.WriteLine("CalledWriteLogMethod");}}publicclassFileLog:LogAdaptee{publicoverridevoidWriteLog(){Console.WriteLine("CalledWriteLogMethod");}}在我们开发完成的应用程序中日志记录接口中(不妨称之为ILogTarget接口,在本例中为了更加清楚地说明,在命名上采用了Adapter模式中的相关角色名字),却用到了大量的Writ

6、e()方法,程序已经全部通过了测试,我们不能去修改该接口。代码如下:publicinterfaceILogTarget{voidWrite();}这时也许我们会想到修改现在的日志记录工具的API接口,但是由于版权等原因我们不能够修改它的源代码,此时Adapter模式便可以派上用场了。下面我们通过Adapter模式来使得该日志记录工具能够符合我们当前的需求。前面说过,Adapter模式有两种实现形式的实现结构,首先来看一下类适配器如何实现。现在唯一可行的办法就是在程序中引入新的类型,让它去继承Log

7、Adaptee类,同时又实现已有的ILogTarget接口。由于LogAdaptee有两种类型的方式,自然我们要引入两个分别为DatabaseLogAdapter和FileLogAdapter的类。图5引入类适配器后的结构图实现代码如下:publicclassDatabaseLogAdapter:DatabaseLog,ILogTarget{publicvoidWrite(){WriteLog();}} publicclassFileLogAdapter:FileLog,ILogTarget{pu

8、blicvoidWrite(){this.WriteLog();}}这里需要注意的一点是我们为每一种日志记录方式都编写了它的适配类,那为什么不能为抽象类LogAdaptee来编写一个适配类呢?因为DatabaseLog和FileLog虽然同时继承于抽象类LogAdaptee,但是它们具体的WriteLog()方法的实现是不同的。只有继承于该具体类,才能保留其原有的行为。我们看一下这时客户端的程序的调用方法:publicclassApp{publicstaticvoidMain(){

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。