代码改变世界

[AS3/设计模式]适配器

2011-11-15 00:13  WesleyWoo  阅读(363)  评论(0编辑  收藏  举报

适配器,简单来说,就是对一个已知类再封装一下,使其能完成相似的功能的同时又满足某种规范(接口)。

一个最简单的适配器需要涉及到三个类:已有类Adaptee、适配器类Adapter、满足的目标接口ITarget。《actionscript3设计模式》中有个例子可以帮我们很好地理解适配器。

汽车驾驶适配器(P189):

有一个汽车类 Car,它有两个公有方法:

public function start():void//汽车启动

public function setSteeringWheelAngle(nAngle:int):void//方向盘,可根据输入的角度转动汽车的方向

这个汽车里就是适配器模式中的“已有类Adaptee”。

现在有一个需求,我们不想用方向盘控制车的方向了,而想改用键盘上"↑↓←→"等方向键来控制。于是,有了一个目标接口ICar:

function start():void//启动

function goStraight():void//向前

function turnRight():void//转右

function turnLeft():void//转左

这是适配器模式中的ITarget。

接下来,就是根据ICar接口来重新封装Car类的适配器CarAdapter:

public Class CarAdapter implements ICar
{

  private var _car:Car = null;

  private var _nAngle:Number = 0.0;

  public function CarAdapter(car:Car) { _car = car; }

  public function start():void{ _car.start(); }

  public function goStraight():void{ _car.setSteeringWheelAngle(0); }

  public function turnRight():void{ _car.setSteeringWheelAngle(90); }

  public function turnLeft():void{ _car.setSteeringWheelAngle(-90); }

}

该适配器类利用Car类原有的setSteeringWheelAngle方法,按照ICar接口规范,封装成实现功能相近的转向功能,这就是适配器模式。

这个例子用到的是对象未作参数传入的对象适配器。

此外还有类适配器,直接继承已有类和规范接口进行扩展。道理相同,都是把已有类进行封装,使其实现了相近的功能又满足接口。

不过面向对象设计中提倡组合,总体来说,组合比继承更灵活。