适配器是常见的硬件概念,比如我们常用的USB转RS232适配器。我们之所以采用适配器,主要是由于以下原因:

一、原有硬件设备已经存在,新的连接设备不存在和旧设备一致的接口。
二、新的设备需要连接很多不同接口的设备,需要构建一个统一的接口。

      OOP适配器模式借用了硬件适配器的概念。软件的升级换代是非常常见的,对于已经成功运行的软件系统,我们在设计新的软件系统时,不可能完全放弃原有的软 件系统。但是经常遇到的情况是原有的软件系统和新的软件系统具有不同的理念,在考虑到扩展性的同时,必须兼容原有的软件系统,此时适配器模式是我们首选的设计模式。

我们看一下适配器模式的定义:
      适配器模式将一个类的接口转换成客户希望的另外一个类的接口。适配器模式使原本不兼容而不能一起工作的类可以一起工作。

Picture
      适配器模式并非特别的技术,其实质是在新的类中借用(翻译)原有类的动作和行为。在面向对象的编程中,当然是两个类之间的关系。对于LV来说,由于早期不存在LVOOP,因此适配器很少针对两个类,但是适配器模式的设计思想完全可以推广到面向过程和面向对象的混合编程中。

下面我们通过一个绘图类说明如何使用适配器模式。

      我们的目的是建立一套通用绘图程序类,包括点、线、圆等等,从图形的角度看,无论是点还是圆形,都存在很多共同点,比如绘图颜色、画笔等等,因此建立一个 形状的类作为基类是非常合适的,在基类的私有数据中存储公共特征,比如颜色和画笔,另外需要在基类中创建一个可重写的绘图函数,这样基类和继承的特殊形状 的子类都可以使用同一绘图函数,实现类的多态特性。

Picture
      我们创建一个形状类作为基类,形状类的私有数据包括画笔和颜色,并分别创建了私有数据的读写属性,形状类中,我们创建了可重写的绘制形状方法。属性的程序框图非常简单,就不贴图了。看一下形状类中可重写绘制形状的程序框图。

Picture
      在基类的绘图函数中,不执行任何实际绘图工作,具体绘图工作延迟到具体子类中实现。
      我们知道,绘制一个圆需要圆的半径和圆心,其中圆心是一个点,因此我们创建一个点类,并将点类作为圆类的私有数据成员之一。

Picture
      在绘制圆类中,我们创建了一个静态方法,用来设置圆心和半径,其实这完全可以通过属性实现。由于属性只能设置单一私有数据的值,而采用方法则不受此限制。

Picture
      我们今天讨论的是适配器模式,假设在原来版本中已经存在类似的绘制圆的类,但是其属性和方法与我们新创建的不同,比如名称,参数顺序等等。由于原有类已经 应用于程序中,并在多处使用。如果直接使用新的绘制圆类,必然导致原有程序的多处修改,这不符合开放封闭原则。这种情况下,适配器方式就非常实用了。

Picture
      为了说明适配器模式,我创建了一个Circle类,表示原来存在的绘制圆类,简单起见,直接封装了LV的绘制圆函数,未执行任何其他操作。
      回过头来,我们看看如何在新建的绘制圆类中,通过适配器方式,调用原有的CIRCLE类,来实现绘制圆的操作。

Picture
      上面的程序框图为绘制圆类中重写的绘制形状方法,在该方法中,建立一个原来的CIRCLE类的实例,并调用了CIRCLE中绘制圆的方法。

      适配器模式是比较简单的,借助于适配器,可以充分利用原有结构。原有结构处于封闭状态,但是通过适配器后,改变了原有类的接口,这样就实现了开发的功能扩展。
      适配器模式基本使用的是类的封装功能,对原有类进行进一步的封装,创建新的接口,使之融入到新的体系中。

Picture



Leave a Reply.