? ? ? ?命令模式可以將請(qǐng)求發(fā)送者和接收者完全解耦鬼贱,發(fā)送者與接收者之間沒有直接引用關(guān)系吧秕,發(fā)送請(qǐng)求的對(duì)象只需要知道如何發(fā)送請(qǐng)求惨寿,而不必知道如何完成請(qǐng)求邦泄。核心在于引入了命令類,通過命令類來降低發(fā)送者和接收者的耦合度裂垦,請(qǐng)求發(fā)送者只需指定一個(gè)命令對(duì)象顺囊,再通過命令對(duì)象來調(diào)用請(qǐng)求接收者的處理方法,命令模式是一種對(duì)象行為型模式蕉拢。
? ? ? ? 要想明白這段定義特碳,我們首先得明白什么是解耦,以及我們?yōu)槭裁葱枰怦钤位弧n櫭剂x午乓,解耦就是解除類與類之間的耦合關(guān)系,解耦能提高程序解決問題的概率届巩,提高解決問題的效果硅瞧,提高解決問題的速度,降低將來爆發(fā)隱患的可能性恕汇。舉個(gè)栗子腕唧,在一家新開業(yè)的咖啡店內(nèi),收銀員與咖啡師是同一個(gè)人瘾英,我們可以稱之為萬能員工枣接,他既要給顧客開單,又要去制作咖啡缺谴。在顧客少的時(shí)候當(dāng)然沒有問題但惶。但當(dāng)?shù)赇伜苁軞g迎時(shí),大量的顧客涌入就會(huì)癱瘓掉這個(gè)單一的開單--制作?的系統(tǒng)。
????????這個(gè)時(shí)候我們就要思考怎么辦膀曾,就我的思路而言县爬,一是增加員工數(shù),咖啡機(jī)數(shù)添谊,二是提高工作效率财喳。由于店鋪本身的限制,我們并不可能無限制地增加員工和咖啡機(jī)的數(shù)量斩狱,因此我們必須提高效率耳高。提高效率的方法有很多種,我們這里就采用面向?qū)ο笾械乃悸匪唬醋尫?wù)員只負(fù)責(zé)下單泌枪,聘請(qǐng)專用的咖啡師來調(diào)咖啡,以減少在下單時(shí)可能的錯(cuò)誤和來回? ?下單---制作咖啡? ?過程中所浪費(fèi)的時(shí)間秕岛。這樣將萬能員工身上的兩項(xiàng)工作分離出來交給兩種不同的角色處理碌燕,這就是解耦。
? ? ? ? 回歸到軟件開發(fā)的思路上來瓣蛀,我們可以將咖啡店的模式套用過來陆蟆,讓服務(wù)員(invoker)與咖啡師(receiver)完全解耦,服務(wù)員只負(fù)責(zé)下單惋增,單子通過命令(command)傳輸被傳遞到咖啡師那兒叠殷,咖啡師只負(fù)責(zé)執(zhí)行,服務(wù)員不用明白咖啡師怎么制作咖啡诈皿,咖啡師不用明白有多少人下了單林束,這樣,二者完全解耦稽亏,更能提高工作效率壶冒。
---------------------------------------------------------代碼實(shí)現(xiàn)--------------------------------------------------------
waiter == invoker;
barista == receiver;
bill == command;
concreteBill == concreteCommand;
------
public interface Bill
{
? ? public void execute();
}
------------------------------------------------
public class Waiter
{
? ? private Bill bill;
? ? public Waiter(Bill bill)
? ? {
? ? ? ? this.bill = bill;
? ? }
? ? public void action()
? ? {
? ? ? ?bill.execute();
? ? }
}
------------------------------------------
public class ConcreteBill implements Bill{?
?private Barista barista;
? ? public ConcreteBill(Barista barista)
? ? {
? ? ? ? this.barista= barista;
? ? }
? ? @Override? ? public void execute()
? ? {
? ? ? ? barista.action();
? ? }
}
------------------------------------------------
public class Barista
{
? ? public void action()
? ? {
? ? ? ? System.out.println("Bill received!");
? ? }
}
---------------------------------------------------
public class Test
{
? ? public static void main(String[] args)
? ? {
? ? ? ? Barista barista = new Barista();
? ? ? ? Bill bill = new ConcreteBill(barista);
? ? ? ? Waiter waiter = new Waiter(bill);
? ? ? ? waiter.action();
? ? }
}
-----------------------------------------------------------------------------------------------------------------------------------
? ? ? ? 這就是簡(jiǎn)單的命令模式模板。