适配器模式探讨
要点
² 一个类的程序设计接口不太方便于某一个专用场合;
² 具备共同特征的类有很多,也就是有共同特征,且不适用于同样的专有场合;
² 可以把一个类的程序设计接口转换成另一个接口,这就是适配器模式;
² 适配器模式通过两种方法可以实现:第一是从原有的类派生新类,然后添加新的一致的方法,使得新类可以符合需要的接口;第二种方法是通过对象组合,也就是适配器类有一个原有类型的数据成员,把它包装成另一组使用接口,这种方法隐藏了原有类型的接口;
² 适配器模式作为结构型模式,特点是每个类型都有一个适配器,无论是派生还是组合,都是一个类型包装成另一个类型接口,而不是多个类型接口组合成一个接口,所以适配器是结构型模式里面的简单情形。
用途
例如,C#提供的winform控件ListBox,其集合数据的操作必须通过属性Items来操作。例如,Items.Add(),Items.Clear()等等。为了直接方便地使用,而不是通过Items,我们可以通过适配器模式把这些接口转换成另外一组接口来使用。
适配器模式正如平时所用的适配器,例如计算机经常使用的网络适配器,键盘适配器。还如原来的大口接头的键盘和小口接口使用的时候采用转接线,本身就是适配器的很好例子。
图1
如图1所示,是依据两种方法构造的适配器。通过继承构造的叫类适配器,而通过组合构造的叫对象适配器。对象适配器的优点是可以隐藏原有类型的接口,因为目的就是把原有的类型接口包装成另外的一组接口,因此隐藏起来要好一些。但是在只包装部分接口的情况下,就不能隐藏原有类型接口了。
图2
图2所示,是适配器类型的更进一步创建方法。在某些情形下,情况可能比较复杂,如果采用图1所示的方法,对系统的扩展性不利,而且耦合会太紧密。通过抽象方法定义一个接口,这个就是抽象层,然后客户程序DemoWinForm与这个抽象层发生耦合,也就是直接使用这个接口,而不是实际的类型。
如图1所示,是依据两种方法构造的适配器。通过继承构造的叫类适配器,而通过组合构造的叫对象适配器。对象适配器的优点是可以隐藏原有类型的接口,因为目的就是把原有的类型接口包装成另外的一组接口,因此隐藏起来要好一些。但是在只包装部分接口的情况下,就不能隐藏原有类型接口了。
图2
图2所示,是适配器类型的更进一步创建方法。在某些情形下,情况可能比较复杂,如果采用图1所示的方法,对系统的扩展性不利,而且耦合会太紧密。通过抽象方法定义一个接口,这个就是抽象层,然后客户程序DemoWinForm与这个抽象层发生耦合,也就是直接使用这个接口,而不是实际的类型。
这样一来,如果添加新的适配器将非常方便,而且如果适配器发生变更,也无需修改客户程序。客户程序通过抽象层消除了与实际类型的耦合。