前言
機(jī)器人Samu
與主人Alice
的故事仍在繼續(xù)疗韵,這次Samu
宕機(jī)了兑障。Alice
重啟了Samu
,Samu
在每次重啟的時(shí)候都會(huì)做些預(yù)定的事件蕉汪。
比如:
- 初始化多種音樂(lè)類(lèi)型的曲庫(kù)
- 跳舞(肚皮舞)
- 唱歌(千里之外)
- 做菜(紅燒肉)
正文
現(xiàn)在需要實(shí)現(xiàn)初始化
這個(gè)功能流译,這個(gè)功能包含的子功能已經(jīng)在上面陳列出來(lái)了。
場(chǎng)景分析:
- 我們把“人與機(jī)器人”稱(chēng)作“人機(jī)交互的上下文”者疤。
HumanComputerInteraction.Context
- 我們把 “人與機(jī)器人對(duì)話的過(guò)程” 稱(chēng)作一次“人機(jī)交互”福澡。
HumanComputerInteraction
代碼實(shí)現(xiàn)
先看下面兩段代碼片段,沒(méi)有任何接口驹马、繼承等革砸。我想說(shuō)設(shè)計(jì)模式應(yīng)著重理解其思想除秀,而非特定模式下的結(jié)構(gòu)實(shí)現(xiàn)
。
public class Client {
public static void main(String[] args) {
// 創(chuàng)建交互的上下文對(duì)象 —— 即"誰(shuí)與機(jī)器人在交互"算利。
HumanComputerInteraction.Context context = new HumanComputerInteraction.Context(new Machine("Samu"), new User("Alice"));
// 創(chuàng)建人機(jī)交互對(duì)象
HumanComputerInteraction interaction = new HumanComputerInteraction(context);
// 初始化人機(jī)交互
interaction.setUp();
}
}
public class HumanComputerInteraction {
private Context context;
public HumanComputerInteraction(HumanComputerInteraction.Context context) {
this.context = context;
}
public void setUp() {
// 初始化曲庫(kù)
final Machine machine = context.getMachine();
final MusicDatabase database = machine.getDatabase();
database.initDatabase();
// 初始化命令
final Invoker invoker = context.getInvoker();
invoker.invoke(new CommandAdapter(CookCommandImpl.KEY_COOK, "紅燒肉", context));
invoker.invoke(new CommandAdapter(DanceCommandImpl.KEY_DANCE, "肚皮舞", context));
invoker.invoke(new CommandAdapter(SongCommandImpl.KEY_SONG, "千里之外", context));
}
}
setUp
方法中封裝了册踩,初始化曲庫(kù)、唱歌效拭、跳舞暂吉、做菜等一系列事項(xiàng)。其也體現(xiàn)了外觀模式(也稱(chēng)作 門(mén)面模式)
的本質(zhì):封裝交互缎患,簡(jiǎn)化調(diào)用
慕的。
總結(jié)
外觀模式的本質(zhì):封裝交互,簡(jiǎn)化調(diào)用较锡。
如上圖业稼,藍(lán)色背景其實(shí)可以視作一個(gè)子系統(tǒng),由外觀類(lèi)組合拼裝各個(gè)功能塊蚂蕴。如果需要暴露子系統(tǒng)的功能低散,則會(huì)考慮暴露子系統(tǒng)的接口。這意味著在一個(gè)良好設(shè)計(jì)的系統(tǒng)中骡楼,子系統(tǒng)僅暴露它應(yīng)該暴露的接口熔号。因?yàn)樽酉到y(tǒng)并不知道,調(diào)用它的是外觀類(lèi)還是客戶端類(lèi)鸟整。
引入外觀類(lèi)是為了解耦與子系統(tǒng)的關(guān)聯(lián)引镊,但并不限制客戶端直接調(diào)用子系統(tǒng)。
不建議在外觀類(lèi)中增加子系統(tǒng)的功能篮条,因?yàn)檫@并不符合外觀模式封裝交互弟头,簡(jiǎn)化調(diào)用
的本質(zhì)。建議直接擴(kuò)展子系統(tǒng)的功能涉茧。
當(dāng)子系統(tǒng)功能發(fā)生改變時(shí)赴恨,可能需要修改外觀類(lèi)以適應(yīng)子系統(tǒng)功能的變化,導(dǎo)致外觀模式
不符合開(kāi)閉原則
伴栓。你可以通過(guò)抽象外觀類(lèi)伦连,一定程度上緩解該問(wèn)題。