Java设计模式之从[鼠标接口][星际争霸中的兵种行为]分析适配器(Adapter)模式
来源:互联网 发布:java实现短信发送功能 编辑:程序博客网 时间:2024/05/01 05:58
适配器将一个类的接口转换成客户希望的另外一个接口。下面用三个例子来反映适配器的不同用途:
情况一:
我买了一个PS2接口的鼠标,但是我的电脑没有PS2的接口,仅有USB的接口。为了不浪费这个鼠标,我跑到商店买了一个PS2到USB的转接头,这样我就用上了PS2的鼠标。USB转接头就是一个典型的适配器。
interface USBPort { void connect(); } interface PS2Port { void connect(); } class USBMouse implements USBPort { public void connect(){ System.out.println("鼠标连接上了USB端口!"); } } class PS2Mouse implements PS2Port{ public void connect(){ System.out.println("鼠标连接上了PS2端口!"); }} class PS22USBMouseAdapter implements USBPort{ private USBPort usbMouse; public PS22USBMouseAdapter (PS2Port ps2Port){ System.out.println("正在将PS2接口转换为USB接口..."); //在此处我们仅仅是新建了一个USBMouse对象,对于更加复杂的情况,我们可以对PS2Port的对象进行很多操作 usbMouse = new USBMouse(); } public void connect(){ usbMouse.connect(); } } class Adapter1 { public static void main(String[] args) { PS2Mouse mouse = new PS2Mouse(); mouse.connect(); USBPort adapter = new PS22USBMouseAdapter(mouse); adapter.connect(); } }
PS22USBMouseAdapter是一个PS2到USB接口的适配器,由于它最终输出的是USB信息,因此继承了USBPort。我们最后实例化adapter时,它的类型是USBPort —— 设计模式就是如此,我们一般用对象的抽象来进行声明和定义,而不是具体的类。PS22USBMouseAdapter实现了PS2接口向USB接口的转变。
情况二:
星际争霸中,人族的顶级兵种为战斗巡洋舰(Battlecruiser)。巡洋舰上有个技能叫做大和炮(Yamato gun)。
假设我们在设计巡洋舰的时候,并没有想到它可以装载大和炮,那么我们的巡洋舰类(Battlecruiser)中仅有一个attack方法。后来我们希望给巡洋舰增加一个大和炮的技能,但是我们又不想修改巡洋舰类的代码,这个时候就可以用适配器来实现,此时的适配器可以理解成,我们在巡洋舰上装一个转换装置,使得它可以安装和发射大和炮。
class Battlecruiser{ public void attack(){ System.out.println("大和战舰发起进攻!"); }}class YamatoAdapter extends Battlecruiser implements Yamato { public void yamato(){ System.out.println("大和战舰使用大和炮进行攻击!"); }}interface Yamato{ void attack(); void yamato();}class Adapter2{ public static void main(String[] args) { Yamato superBattlecruiser = new YamatoAdapter(); superBattlecruiser.attack(); superBattlecruiser.yamato(); }}
注意,Battlecruiser类是我们一开始就设计好的。为了能给巡洋舰装上大和炮,我们新建了一个Yamato接口,这个接口有原来巡洋舰的attack方法,并且还增加了一个yamato方法。最后,建立一个继承于巡洋舰的类YamatoAdapter,在测试类中用Yamato实例化一个巡洋舰,它既可以普通攻击,又可以用大和炮进行攻击。
你可能会想,明明YamatoAdapter已经继承了Battlecruiser,为何还要继承Yamato接口?原因如之前所说,我们用“接口”来定义对象,而不是用具体的类。
情况三:
我需要设计星际争霸人族兵种的一些抽象过程。如,所有兵种都要继承于一个接口,这个接口有attack、stop、move等方法。这也就意味着,任何一个兵种类都要实现attack、stop、move这三个方法。
这样一来会有一个问题:并非所有的兵种都有attack、stop、move这3个行为。例如人族的医疗兵(Medic),她不具有attack行为(游戏中她是无法攻击敌人的);再例如人族的秃鹰战车(Vulture,我们俗称的布雷车),它可以埋蜘蛛雷。蜘蛛雷在敌人靠近的时候,它才会进行自爆攻击。也就是说,蜘蛛雷不具有stop和move方法,只具有attack方法。
可见,一旦接口的方法多了起来,我们为了实现它们得手工写不少代码,要是其中若干方法是我们该类不会用到的,我们不得不写一个空方法。为了减少代码编写,这时,我们可以使用接口的适配器模式:
interface StarcraftSoldier{ void attack(); void stop(); void move();}abstract class SoldierAdapter implements StarcraftSoldier { public void attack(){} public void stop(){} public void move(){}}class SpiderMine extends SoldierAdapter { public void attack(){ System.out.println("蜘蛛雷发现敌人,进攻!"); }}class Adapter3{ public static void main(String[] args) { new SpiderMine().attack(); }}
接口的适配器SoldierAdapter为接口StarcraftSoldier的所有方法做了空实现,在我们创建SpiderMine时,继承SoldierAdapter,就不必将接口中的所有方法都实现一次了。
以上就是我所理解的适配器的用途,我把它理解成一个兼容装置,或者转换装置。若有牵强的地方,欢迎大家指出。
- Java设计模式之从[鼠标接口][星际争霸中的兵种行为]分析适配器(Adapter)模式
- Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式
- Java设计模式之从[游戏中的兵种状态转换]分析状态(State)模式
- Java 设计模式 接口型模式 之 适配器Adapter模式
- Java:设计模式之适配器模式Adapter
- java设计模式之适配器模式Adapter
- 【Java 设计模式】接口型模式--Adapter(适配器)模式
- 【Java 设计模式】接口型模式--Adapter(适配器)模式
- Java设计模式之从[星际争霸1]分析抽象工厂模式
- Java设计模式之从[魔兽争霸、星际争霸、DOTA编队]分析迭代器(Iterator)模式
- JAVA设计模式系列之Adapter(适配器)
- java 设计模式之适配器Adapter
- Java:设计模式之适配器Adapter(续)
- Java设计模式之适配器(Adapter)
- Java设计模式之适配器(Adapter)
- java设计模式之— 适配器(Adapter)
- Java设计模式之适配器Adapter
- Java设计模式之适配器(Adapter)
- POJ 2385 Apple Catching DP
- Android添加按钮事件的几种方法
- ubuntu 安装wineqq国际版方法及可能出现的问题
- 详解hosts文件
- 为什么我们应该像盖房子那样写程序?
- Java设计模式之从[鼠标接口][星际争霸中的兵种行为]分析适配器(Adapter)模式
- 事从容,则有余味;人从容,则有余年
- Linux代码阅读笔记----基本概念
- 雅虎网站页面性能优化的34条黄金守则
- C#笔记之隐式转换和显示转换
- phpcms学习总结
- Palindrome Partitioning
- 安装MATLAB_R2013b_X64_x32激活及破解方法
- Command(命令模式)