您的位置:首页 > 其它

白话设计模式--结构型模式之 适配器模式(Adapter)

2008-08-26 15:46 417 查看
适配其实在生活中的例子很多。一个变压器就是最好的例子。

我们不能要求供电局为了我们的随身听而把电压变成12V,只能使用一个变压器把220V的电转换成12V的。这就是个适配器的很好的

例子。新的需求就是我们要12V的电,而原来的电只能提供220V,那么我们就定义一个接口叫做"12V电源使用",然后定一个Adapter

变压器,里面接收(组合)了220V的电源,在里面经过一系列的动作以后,实现了"12V电源使用"这个接口,传出12V电源。

设计模式中的适配器模式可以分为对象适配器和类适配器

对象适配器中适配与被适配的对象是组合关系,符合面向对象设计原则:优先选择组合方案,而不是继承方案。

类的适配器中适配与被适配的对象是继承关系,适配器要继承被适配对象和新的接口。由于C#(vb.net)并不支持多继承,所以限制

了类适配器的使用,所以在dotnet中并不推荐使用这种适配方式。

当一个对象A不能满足新需求R时,就可以定义一个适配器Adaper,把A组合到新的Adaper中。在Adaper中使用A的功能和新功能以满

足新需求R。

这句话就说明了适配器模式。适配器就是Adaper,被适配的对象就是A,新需求R可以定义一个接口,并用适配器实现这个接口。

在软件设计过程中,也有很多不那么规范的Adapter模式,但是它们也是适配器的思想,也叫做适配器。

如果我们现在存在一个Case类,代表工作。现在有个新的需求,要求对Case根据一些条件进行排序。而Case类本身是没有排序功能的

,这么办呢? Aapter模式就有用了。在这种情况下,我们可以做个Adapter,它实现Icompareable接口。在使用时,直接为Case数

组调用Sort方法,并传入Case数组和刚才新建的adapter对象就可以了。但是这么实现呢?在适配器(CaseAdapter)里实现一个

Compare方法,传进去两个Case对象,根据Case的某个属性,返回一个数值。根据这个值就知道哪个该放在前面了。在这里,并没有

把被适配的对象Case放入Adapter中,而是直接通过参数传入。这并没有符合设计模式的结构,但是却使用了适配器模式的思想.调用代码如下:

3 Console.WriteLine("before sort");

4 for (int i = 0; i < cases.Length; i++)

5

9 Array.Sort(cases, new CaseCompareAdapter());

10 Console.WriteLine("after sort");

11 for (int i = 0; i < cases.Length; i++)

12

16 Console.ReadLine();

那么,如果标准的适配器模式结构是怎么样的呢?

假设我们现在要为Case加上一个TellAlerm的方法,但是却不能去修改Case类,这时就可以使用Adapter了。

我们新建一个CaseAlermAdapterStandard类,然后在构造方法中初始化一个Case对象。然后定义一个方法叫做TellAlarm,返回一个字符串。定义一个ItemCount,返回构造函数中的Case的ItemCount。现在就可以调用了。

调用代码如下:

//standard structure for adapter design pattern

2 CaseAlarmAdapterStandard cAdapter = new CaseAlarmAdapterStandard(6);

3 Console.WriteLine(cAdapter.ItemCount);

4 cAdapter.ItemCount = 788;

5 Console.WriteLine(cAdapter.ItemCount);

6 Console.WriteLine(cAdapter.TellAlarm("due to deadline!"));

7 Console.ReadLine();

完整的适配器代码:Adapter design pattern

我说完这些,自己却有个疑惑,所谓适配器,是不是就是被适配的对象的所有功能+新功能呢?还是说根据需要选择被适配对象的功能?我个人觉得可能应该是根据需要选择被适配对象的功能.因为有可能我这个适配器不需要那么多功能,只需要被适配对象的一部分功能+新接口定义的功能,就可以满足要求了.

欢迎大家拍砖,我是学习设计模式的新手,希望大家多多指教.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: