GOF之适配器模式

动机(Motivation)

在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是环境要求的接口是这些现存对象不满足的。

如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?

意图(Intent)

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

结构(Structure):

对象适配器:

类适配器:

代码实现:

 1 对象适配器
 2  interface IStackable
 3     {
 4         void Push(object item);
 5         object Pop();
 6         object Peek();
 7     }
 8     //对象适配器
 9     public class MyStack : IStackable//适配对象
10     {
11         ArrayList list;//被适配对象
12         private int _top=-1;
13         public MyStack()
14         {
15             list = new ArrayList();
16         }
17         public void Push(object item)
18         {
19             list.Add(item);
20             _top++;
21         }
22
23         public object Pop()
24         {
25             _top--;
26             return list[_top+1];
27         }
28
29         public object Peek()
30         {
31             return list[_top];
32         }
33     }
 1 类适配器
 2   //类适配器
 3     public class MyStack :ArrayList, IStackable//适配对象
 4     {
 5         private int _top1=-1;
 6         public void Push(object item)
 7         {
 8             this.Add(item);
 9             _top1++;
10         }
11
12         public object Pop()
13         {
14             _top1--;
15             return this[_top1 + 1];
16         }
17
18         public object Peek()
19         {
20             return this[_top1];
21         }
22     }

Adapter模式的几个要点:

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

GoF23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。

Adapter模式可以实现的非常灵活,不必拘泥于GoF23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接方法参数,来达到适配的目的。

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

 1 对于已经存在的类作为被适配对象的代码实现
 2 //已经存在的类,被适配对象
 3     public class ExistingClass
 4     {
 5         public void SpecificRequest1()
 6         {
 7
 8         }
 9         public void SpecificRequest2()
10         {
11
12         }
13     }
14
15     interface Itarget
16     {
17         void request();
18     }
19     //另外一个系统
20     public class MySystem
21     {
22         public void Process(Itarget target)
23         {
24
25         }
26     }
27
28     public class Adapter : Itarget
29     {
30         ExistingClass adaptee=new ExistingClass ();
31
32         public void Request()
33         {
34             adaptee.SpecificRequest1();
35             adaptee.SpecificRequest2();
36         }
37     }

.NET框架中的Adapter应用:

在.NET中复用COM对象:

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

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

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

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

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

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

--现有对象未实现IComparable接口。

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

 1 排序比较器的代码实现:
 2  public int Compare(object x, object y)
 3         {
 4             Person p1 = (Person)x;
 5             Person p2 = (Person)y;
 6             if (p1.Age == p2.Age)
 7             {
 8                 return 0;
 9             }
10             else if (p1.Age < p2.Age)
11             {
12                 return -1;
13             }
14             else
15             {
16                 return 1;
17             }
18         }
 1 比较对象类
 2 class Person
 3     {
 4         private int _age;
 5
 6         public int Age
 7         {
 8             get { return _age; }
 9             set { _age = value; }
10         }
11         private string _name;
12
13         public string Name
14         {
15             get { return _name; }
16             set { _name = value; }
17         }
18         public Person(int age, string name)
19         {
20             this.Age = age;
21             this.Name = name;
22         }
23     }
 1 主函数的调用
 2 static void Main(string[] args)
 3         {
 4             Person[] list = new Person[] {
 5                 new Person(12,"ZS"),
 6                 new Person(10,"ls"),
 7                 new Person(20,"wz"),
 8                 new Person(14,"zl")
 9             };
10             Array.Sort(list,new MyCompare());
11             foreach (var item in list)
12             {
13                 Console.Write(item.Name+",");
14             }
15             Console.ReadLine();
16         }
时间: 2024-11-10 07:30:08

GOF之适配器模式的相关文章

设计模式之适配器模式(Adapter)

我想要是说适配器模式,提一下"电压"."耳机"."充电器"和 "USB"  的例子应该是比较恰当的了.就说说自己的亲身经历,我原来的手机是NOKIA5730.后来也不知道有没有国行,但是不推荐大家买这款手机,不适用的哈.我买的时候只有港货,可是大家知道的啊,香港的充电器和我们大陆的充电器规格是不一样的,那我要是在国内充电,原机带的充电器根本用不了,所以要花25RMB买一个公牛的适配器,这样才可以充电!! 1.初识适配器模式 我

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同

节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式. 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清. 今天再重新学习下,把学习心得分享给大家一下.这次是结合的我工作中的实际项目. 设计模式,其实是一种解决方法,JAVA作为一种面向对象的语言,对于所有的设计模式在实现上,总是少不了对接口的实现,对抽象类的继承,有时候似乎是为了去实现接口而去写接口,所以在这三种模式的说明代码中,我们都定义了接口这些东西,所以才有了现在的混淆. 先不厌其烦的介绍

设计模式06: Adapter 适配器模式(结构型模式)

Adapter 适配器模式(结构型模式) 适配(转换)的概念无处不在:电源转接头.电源适配器.水管转接头... 动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象不能满足的.如何应对这种“迁移的变化”?如何既能够利用现有对象的良好表现,同时又能满足新的应用环境所要求的接口? 意图(Intent)将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一

设计模式思考----适配器模式

将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 解决的问题: 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 类图: 模式中的角色 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 需要适配的类(Adaptee):需要适配的类或适配者类. 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口.   注:在GoF的设计模式中,对

设计模式(七):Adapter 适配器模式 -- 结构型模式

1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器.可以使用这个电源适配器充电.这个iphone的电源适配器就是类似我们说的适配器模式.(电源适配器就是把电源变成需要的电压,也就是适配器的作用是使得一个东西适合另外一个东西.)  例子2:最典型的例

说说设计模式~适配器模式

之前和大家一起谈了工厂模式和单例模式,今天来看一下另一种非常常用的模式,它就是适配器模式,第一次看到这个模式是通过"张逸"老师的"设计之道"这篇文章,在这里表adapter讲的很透彻,今天把张老师的文章拿过来,分享给大家! 何时能用到它? 对于一个软件生产商A来说,在过去的20年里,它们主要生产收音机,包括最早的老式半导体和现代的数字收音机,总之,是收音机.但不知道从什么时候开始,MP4媒体播放器出现了,这使得A生产商不得不去招新人,去生产适合大家的mp4播放器,这

Adapter 适配器模式(设计模式03)

疑问: 在软件系统中,由于应用环境的变化,常常需要将"一些现存的对象"放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的. 如何应对这种"迁移的变化"? 如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口? 定义: 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. --<设计模式>GoF 一.对象适配器 对象适配器采用对象组合,通过引用一个类与另一个类接

设计模式——适配器模式(Adapter)

基本概念 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式.适配器模式还有一个特例,就是缺省适配模式(Default Adapter),又称接口适配模式. 1. 类适配器模式 把适配类的API转换成目标类的API, 由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,虽然C#.java等 语言都不支持多重继承,但是也可以简单的使用类    

6.适配器模式(Adapter Pattern)

适配(转换)的概念无处不在......适配,即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口.例如:二转换为三箱插头,将高电压转换为低电压等.    动机(Motivate):    在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的.    那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式.意图(Intent):