依旧参考大话模式当中的例子,改变一下改成适合的as程序。适配器模式,将一个类的接口转换客户希望的另一外一个接口。
生活中,我们可以常见的电器插口,电脑硬盘并口转换串口的做法。可以想象他就是一个适配器。
在大话模式当中,说到NBA姚明的例子,这个例子使用了一个简单的做法,通过翻译者继承共有的接口,同时关联外籍中锋类。好,现在我们尝试写一个球员类Player.as 类。
<textarea cols="50" rows="15" name="code" class="c-sharp">package { public class Player { /* 球员类,有防守和攻击两个方法 * */ public var name:String; public function Player(name:String) { this.name=name; } public function Attack():void { } public function Defense():void { } } }</textarea>
在这个类当中,我们有两个方法,一个是攻击,一个是防守。
<textarea cols="50" rows="15" name="code" class="c-sharp">package { public class Guards extends Player { /* 后卫类,有防守和攻击两个方法 * */ public function Guards(name:String) { super(name); this.name=name; } override public function Attack():void { trace("进攻" +name); } override public function Defense():void { trace("防守" +name); } } }</textarea>
其他的前锋一样。
.......................
.............................
.....................................
.........................................
接下来,我们写一个外籍中锋类:中锋类当中由于和球员类的接口不一样,导致在战术上不能有效执行为了修复这个错误,我们使用了翻译者。
<textarea cols="50" rows="15" name="code" class="c-sharp">package { public class ForeignCenter { /* 外籍中锋类,有防守和攻击两个方法,但是不会听英语的,需要通过翻译者翻译才知道战术的布置 * */ private var name:String; public function ForeignCenter() { } public function get Name():String { return name; } public function set Name(name:String):void { this.name=name; } public function jingong():void { trace("外籍中锋"+Name+"进攻"); } public function fangshou():void { trace("外籍中锋"+Name+"防守"); } } }</textarea>
外籍中锋,当中由于不会听取英语,所以要通过翻译者翻译,然后执行战术,这里编程过程关联了外籍中锋类,封装了外籍中锋类当中的方法。通过翻译者,间接使用了中锋的方法。
<textarea cols="50" rows="15" name="code" class="c-sharp">package { public class Translator extends Player { /* 翻译者类,翻译防守和攻击执行战术 * */ private var yaoming:ForeignCenter=new ForeignCenter();//外籍中锋 public function Translator(Name:String) { super(Name); yaoming.Name=Name; } override public function Attack():void { yaoming.jingong(); } override public function Defense():void { yaoming.fangshou(); } } }</textarea>
翻译者告诉中锋,下达了进攻和防守的命令,从而变成了符合预期的接口。
进行测试一下:创建一个翻译员,翻译员告诉姚明,在比赛上进攻和防守,同样后卫也一样,执行战术
<textarea cols="50" rows="15" name="code" class="c-sharp">package { import flash.display.Sprite; import flash.events.*; public class Test extends Sprite { public function Test() { var ym:Player=new Translator("姚明"); ym.Attack(); ym.Defense(); var bd:Guards=new Guards("小布"); bd.Attack(); } } }</textarea>
输出:
外籍中锋姚明进攻
外籍中锋姚明防守
进攻小布
参考资料:《大话模式》171--179页。改写了一个例子