C#面向对象设计模式纵横谈:Adapter 适配器模式 - 范文中心

C#面向对象设计模式纵横谈:Adapter 适配器模式

05/29

适配(转换)的概念无处不在

适配,即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口。

动机(Motivation)

在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?

意图(Intent)

将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

——《设计模式》 GoF

例说Adapter应用

这种实际上是一种委派的调用,本来是发送请求给MyStack,但是MyStack实际上是委派给list去处理。MyStack在这里其实就是Adapter(适配对象),list即是Adaptee(被适配的对象),而IStack就是客户期望的接口。

结构(Structure)

适配器有两种结构

-对象适配器(更常用)

对象适配器使用的是对象组合的方案,它的Adapter核Adaptee的关系是组合关系,即上面例子中MyStack和list是组合关系。

OO中优先使用组合模式,组合模式不适用再考虑继承。因为组合模式更加松耦合,而继承是紧耦合的,父类的任何改动都要导致子类的改动。上面的例子就是对象适配器。

-类适配器

下面的例子是类适配器。

Adapter继承了ArrayList,也继承了IStack接口,它既可以使用ArrayList里的方法,也可以使用IStack接口里的方法,这样就感觉有点不伦不类。这个类违反了类应该具有单一职责的原则,它既有ArrayList的职责,也有IStack的职责,因此这种类适配不是很常用,也不推荐使用。

另外,如果一个方法有可能要委托到2个或2个以上的对象,或者2个或2个以上的类需要委托,对于对象适配器,只需要增加几个内部的属性就可以实现适配。

而对于类适配器,因为C#中类只能是单一继承,它不能继承自2个或2个以上的类,所以类适配器这里便无法使用。

Adapter模式的几个要点

Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。

GoF23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。Adapter模式可以实现的非常灵活,不必拘泥于GoF23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。

Adapter模式本身要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期很方便地适配。

.NET框架中的Adapter应用

1.在.NET中复用COM对象:

-COM对象不符合.NET对象的接口

-使用tlbimp.exe来创建一个Runtime Callable Wrapper(RCW)以使其符合.NET对象的接口

2..NET数据访问类(Adapter变体):

-各种数据库并没有提供DataSet接口

-使用DbDataAdapter可以将任何个数据库访问/存取适配到一个DataSet对象上

微软把适配器和被适配的对象分离了,它把EmployeeDAO作为适配器了。这和上面的模式有点不同,但是原理都是一样的,如果是写成下面的样子,就比较好理解了。

DataSet就是一个适配器

3.集合类中对现有对象的排序(Adapter变体):

-现有对象未实现IComparer接口

-实现一个排序适配器(继承IComparer接口),然后在其Compare方法中对两个对象进行比较

这样写是会报错的,因为要使用Array.Sort的静态方法,传入的参数类型Employee必须要求实现IComparer接口。但如果Employee类已经在很多地方使用了,我们不能更改它,这个时候可以考虑适配。Array.Sort方法本身提供了一种重载,可以传入一个比较方法。

因此我们可以重新写一个类实现IComparer接口,这里是让员工根据年龄排序

这里的实现适配没有把适配器放在类里面。没必要非要做成教科书上的结构才叫适配器,把适配对象直接作为参数传递一样是一种很好的做法。


相关内容

  • net互联网软件开发工程师 new-2
    .NET互联网软件开发工程师 岗位描述: 字不能放在变量名首位 8.C# 数组从零开始建立索引,即数组索引从零开始.C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似.但还有一些差异应引起注意. 声明数组时,方括号 ([]) 必须 ...
  • 基于"C#程序设计"课程的混合式学习
    [摘要]文章提出混合式学习的教学模式,并以"C#程序设计"课程为例进行了具体应用.主要针对教学思想和教学平台两方面的研究,在具体的教学单元中实施"主导-主体"的教育思想,采用"预习" ...
  • C#程序设计简介英文技术资料翻译中文
    英文原文: C# Program Design C# introduction C# (pronounced "See Sharp") is a simple, modern, object-oriented, and ...
  • 软件体系结构试题免费版本
    软件体系结构考试试题 1.设计模式一般用来解决什么样的问题( a) A.同一问题的不同表相 B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 2.下列属于面向对象基本原则的是( c ) A.继承 B.封装 C.里氏代换 D都不是 ...
  • 计算机英语常用词汇对照2
    计算机英语常用词汇对照 计算机英语常用词汇对照2006-08-28 09:47收集了一些常用的计算机英语词汇,分类列出,需要的同学自行浏览,或使用IE 浏览器的"编辑/查找"菜单输入汉字或英文关键字,在当前页查询结果. ...
  • 15秋福师[网络管理与应用]在线作业二答案
    福师<网络管理与应用>在线作业二 一.单选题(共 50 道试题,共 100 分.) 1. 每个W站点必须有一个主目录来发布信息,IIS默认的主目录为( ). . \Wsit . \Intpu\wwwroot . \Intrnt ...
  • 联通笔试题
    选择题 1.通信网的基本结构形式有五种,以下正确的说法是(C) A.网型.星型.树型.环型.总线型: B.网型.星型.线型.复合型.环型: C.网型.星型.复合型.环型.总线型: D.网型.环型.线型.复合型.树型. 2.N个节点完全互联的 ...
  • Android 高级面试题及答案
    阅读目录 一 性能优化 1.如何对 Android 应用进行性能分析 android 性能主要之响应速度 和UI刷新速度. 可以参考博客:Android系统性能调优工具介绍 首先从函数的耗时来说,有一个工具TraceView 这是andro ...
  • 服务器集群技术及其在视频网络中的应用
    服务器集群技术及其在视频网络中的应用服务器集群技术及其在视频网络中的应用 2004年度河南省广播电视优秀科技论文一等奖 [摘要] 本文详细阐述了服务器集群的概念. 优点.实现模式.组件及组件之间的相互作用关系,集群故障转移发生的条件和实现过 ...
  • 关闭多余的系统服务提高系统运行效率
    关闭多余的系统服务, 提高系统运行效率! f77 关闭多余的系统服务,提高系统运行效率! 关闭多余的系统服务,提高系统运行效率! 文章转自: 陪你醉生梦死 评价一个操作系统,最常用的指标包括安全性.稳定性.易用性.运行效率等.下面,就按照这 ...