公告
如果您是第一次閱讀我的設(shè)計(jì)模式系列文章躁锡,建議先閱讀設(shè)計(jì)模式開篇,希望能得到您寶貴的建議察郁。
前言
自動(dòng)Alice
買了機(jī)器人之后酪夷,就一直玩的不可開交酪耕。Alice
發(fā)現(xiàn)機(jī)器人真的很智能,相比久遠(yuǎn)前的PC
時(shí)代 — — 什么都要自己去敲命令滓彰,現(xiàn)在的機(jī)器人只要直接跟它對(duì)話就可以了控妻。
正文
Alice
: 播放歌曲 稻香!
Samu
: ……
Alice
: 跳舞舞蹈 拉丁舞找蜜!
Samu
: ……
Alice
: 開門 客廳門饼暑!
Samu
: ……
Alice
: 燒水稳析!
Samu
: ……
Alice
: 做菜 紅燒魚洗做!
Alice
: 做菜 酸菜魚!
Alice
: 做菜 水煮魚彰居!
Samu
: ……
程序員視角
一切命令都是通過語音命令
錄入的诚纸,語音命令
需要適配跳舞
、唱歌
陈惰、開門
畦徘、燒水
、做菜
等命令抬闯。
所以這里牽扯到適配模式的定義:
適配器模式使得那些原本不兼容的接口適配之后得以工作井辆。
所以適配器模式適合為已有的接口
作適配,適配器模式不生產(chǎn)新的接口溶握。
如何實(shí)現(xiàn)
已有的功能命令有: ** 播放歌曲杯缺、跳舞、開門睡榆、燒水萍肆、燒菜。**
期望的表現(xiàn)形式是:** 通過語音指令胀屿,分派給不同的命令實(shí)現(xiàn)塘揣。**
需建立:字符串指令的適配器 來適配不同的指令的實(shí)現(xiàn)。
// 適配類:用于適配ICommand接口
public class CommandAdapter implements ICommand {
private String method;
private String param;
private User user;
private Machine machine;
// 傳入是字符串指令與上下文信息
public CommandAdapter(String method, String param, User user, Machine machine) {
this.method = method;
this.param = param;
this.user = user;
this.machine = machine;
}
@Override
public void excute() {
// 依據(jù)傳入的字符串指令宿崭,找到對(duì)應(yīng)的指令
Command command = (Command) CommandSimpleFactory.createCommand(this.user, this.machine, this.method, this.param);
command.excute();
}
指令通過Invoke
客戶端執(zhí)行調(diào)用
public class Invoker {
public void invoke(CommandAdapter adapter) {
adapter.excute();
}
}
分析下代碼:
-
CommandAdapter
實(shí)現(xiàn)了接口ICommand
亲铡,理解為CommandAdapter
用于適配ICommand
接口。 -
ICommand#excute()
方法中葡兑,依據(jù)傳入?yún)?shù)method
的不同匹配正確的指令實(shí)現(xiàn)
奖蔓。理解為適配的具體行為。
這是單向的適配器(即:CommandAdapter
實(shí)現(xiàn)了ICommand
接口)铁孵,使CommandAdapter
可以視作ICommand
正常調(diào)用锭硼。
那么何為雙向適配器?即適配器對(duì)象蜕劝,同時(shí)實(shí)現(xiàn)了目標(biāo)接口
與被適配接口
檀头。
舉個(gè)雙向適配器的例子:
- 當(dāng)你家的插座是2口的時(shí)候轰异,但要用的電器需要3口插座。(單向暑始,2口 適配 3口)
- 當(dāng)你家的插座是3口的時(shí)候搭独,但要用的電器需要2口插座。(單向廊镜,3口 適配 2口)
當(dāng)適配器同時(shí)實(shí)現(xiàn)上述兩個(gè)單向適配器的時(shí)候牙肝,即認(rèn)為是雙向適配器。
總結(jié)
適配器模式又稱為包裝器嗤朴,是用來將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口配椭。這可以使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。適配器模式的關(guān)鍵是建立一個(gè)適配器雹姊,這個(gè)適配器實(shí)現(xiàn)了目標(biāo)接口并且包含了被適配者的引用股缸。
適配器的本質(zhì):轉(zhuǎn)化匹配,復(fù)用功能