白话设计模式--结构型模式之 适配器模式(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
我说完这些,自己却有个疑惑,所谓适配器,是不是就是被适配的对象的所有功能+新功能呢?还是说根据需要选择被适配对象的功能?我个人觉得可能应该是根据需要选择被适配对象的功能.因为有可能我这个适配器不需要那么多功能,只需要被适配对象的一部分功能+新接口定义的功能,就可以满足要求了.
欢迎大家拍砖,我是学习设计模式的新手,希望大家多多指教.
我们不能要求供电局为了我们的随身听而把电压变成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
我说完这些,自己却有个疑惑,所谓适配器,是不是就是被适配的对象的所有功能+新功能呢?还是说根据需要选择被适配对象的功能?我个人觉得可能应该是根据需要选择被适配对象的功能.因为有可能我这个适配器不需要那么多功能,只需要被适配对象的一部分功能+新接口定义的功能,就可以满足要求了.
欢迎大家拍砖,我是学习设计模式的新手,希望大家多多指教.
相关文章推荐
- C#设计模式之六适配器模式(Adapter Pattern)【结构型】
- 设计模式(6) 结构型模式和适配器模式(ADAPTER)
- Java经典设计模式-结构型模式-适配器模式(Adapter)
- [设计模式笔记]二. 结构型模式--7.Adapter模式(适配器模式)(二)
- 设计模式(8)の结构型の适配器模式(Adapter)
- 设计模式(五)适配器模式Adapter(结构型)
- 设计模式(五)适配器模式Adapter(结构型)
- 结构型设计模式---适配器模式(adapter)
- .Net设计模式 Adapter 适配器模式(结构型模式)Adapter Pattern
- 设计模式(五)适配器模式Adapter(结构型)
- 设计模式(6)-结构型-适配器模式(Adapter)(个人笔记)
- 白话设计模式--结构型模式--组合模式,桥接模式和适配器模式
- 结构型设计模式---Adapter模式(适配器模式)
- "围观"设计模式(11)--结构型之适配器模式(Adapter Pattern)
- 23种设计模式(6)_结构型_适配器模式(Adapter Pattern)
- JAVA设计模式(6) —<结构型>适配器模式(Adapter)
- 白话设计模式 --结构型模式--装饰者(Decorator)模式,适配器模式和外观模式
- 设计模式学习(结构型模式)—适配器模式(Adapter)
- 设计模式(六):适配器模式Adapter(结构型模式)
- 设计模式-结构型- 适配器模式(Adapter)