淺談Java設(shè)計模式之命令模式

? ? ? ?命令模式可以將請求發(fā)送者和接收者完全解耦,發(fā)送者與接收者之間沒有直接引用關(guān)系,發(fā)送請求的對象只需要知道如何發(fā)送請求,而不必知道如何完成請求。核心在于引入了命令類,通過命令類來降低發(fā)送者和接收者的耦合度,請求發(fā)送者只需指定一個命令對象,再通過命令對象來調(diào)用請求接收者的處理方法,命令模式是一種對象行為型模式。

? ? ? ? 要想明白這段定義,我們首先得明白什么是解耦,以及我們?yōu)槭裁葱枰怦?。顧名思義,解耦就是解除類與類之間的耦合關(guān)系,解耦能提高程序解決問題的概率,提高解決問題的效果,提高解決問題的速度,降低將來爆發(fā)隱患的可能性。舉個栗子,在一家新開業(yè)的咖啡店內(nèi),收銀員與咖啡師是同一個人,我們可以稱之為萬能員工,他既要給顧客開單,又要去制作咖啡。在顧客少的時候當(dāng)然沒有問題。但當(dāng)?shù)赇伜苁軞g迎時,大量的顧客涌入就會癱瘓掉這個單一的開單--制作?的系統(tǒng)。

????????這個時候我們就要思考怎么辦,就我的思路而言,一是增加員工數(shù),咖啡機(jī)數(shù),二是提高工作效率。由于店鋪本身的限制,我們并不可能無限制地增加員工和咖啡機(jī)的數(shù)量,因此我們必須提高效率。提高效率的方法有很多種,我們這里就采用面向?qū)ο笾械乃悸罚醋尫?wù)員只負(fù)責(zé)下單,聘請專用的咖啡師來調(diào)咖啡,以減少在下單時可能的錯誤和來回? ?下單---制作咖啡? ?過程中所浪費(fèi)的時間。這樣將萬能員工身上的兩項工作分離出來交給兩種不同的角色處理,這就是解耦。

? ? ? ? 回歸到軟件開發(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();

? ? }

}

-----------------------------------------------------------------------------------------------------------------------------------

? ? ? ? 這就是簡單的命令模式模板。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,653評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,741評論 18 399
  • 設(shè)計模式分類 總體來說設(shè)計模式分為三大類:創(chuàng)建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原...
    lifeline丿毅閱讀 1,348評論 0 2
  • 1.風(fēng)會熄滅蠟燭,卻能使火越燒越旺。對隨機(jī)性、不確定性和混沌也是一樣:你要學(xué)會利用它們,而不是躲避它們。你要成為火...
    A01琪公子閱讀 3,825評論 0 3
  • 這段時間在看唐史相關(guān)的書,包括《血腥的盛唐》《易中天中華史·隋唐定局》《劍橋中國隋唐史》等,發(fā)現(xiàn)唐朝有許多與眾不同...
    秦瑟讀書閱讀 735評論 0 2

友情鏈接更多精彩內(nèi)容