java中的命令模式

本文參考:http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/command.html

一扣蜻、模式動(dòng)機(jī)

在軟件設(shè)計(jì)中,我們經(jīng)常需要向某些對(duì)象發(fā)送請(qǐng)求颤霎,但是并不知道請(qǐng)求的接收者是誰看杭,也不知道被請(qǐng)求的操作是哪個(gè)赫编,我們只需在程序運(yùn)行時(shí)指定具體的請(qǐng)求接收者即可巷帝,此時(shí)叨咖,可以使用命令模式來進(jìn)行設(shè)計(jì)像啼,使得請(qǐng)求發(fā)送者與請(qǐng)求接收者消除彼此之間的耦合,讓對(duì)象之間的調(diào)用關(guān)系更加靈活蒲拉。

命令模式可以對(duì)發(fā)送者和接收者完全解耦肃拜,發(fā)送者與接收者之間沒有直接引用關(guān)系,發(fā)送請(qǐng)求的對(duì)象只需要知道如何發(fā)送請(qǐng)求雌团,而不必知道如何完成請(qǐng)求燃领。這就是命令模式的模式動(dòng)機(jī)。

二锦援、模式定義

命令模式(Command Pattern):將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象猛蔽,從而使我們可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志灵寺,以及支持可撤銷的操作曼库。命令模式是一種對(duì)象行為型模式,其別名為動(dòng)作(Action)模式或事務(wù)(Transaction)模式略板。

三毁枯、模式結(jié)構(gòu)

命令模式包含如下角色:

  • Command: 抽象命令類
  • ConcreteCommand: 具體命令類
  • Invoker: 調(diào)用者
  • Receiver: 接收者
  • Client:客戶類
image

四、代碼分析

public class Receiver {
    public void doSomething() {
        System.out.println("接受者-業(yè)務(wù)邏輯處理");
    }
}

public abstract class Command {
    public abstract void execute();
}

public class ConcreteCommand extends Command {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.doSomething();
    }
}

public class Invoker {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void action() {
        this.command.execute();
    }
}

public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);
        //客戶端直接執(zhí)行具體命令方式(此方式與類圖相符)
        command.execute();

        //客戶端通過調(diào)用者來執(zhí)行命令
        Invoker invoker = new Invoker();
        invoker.setCommand(command);
        invoker.action();
    }
}

五蚯根、模式分析

命令模式的本質(zhì)是對(duì)命令進(jìn)行封裝后众,將發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開胀糜。

  • 每一個(gè)命令都是一個(gè)操作:請(qǐng)求的一方發(fā)出請(qǐng)求颅拦,要求執(zhí)行一個(gè)操作;接收的一方收到請(qǐng)求教藻,并執(zhí)行操作距帅。
  • 命令模式允許請(qǐng)求的一方和接收的一方獨(dú)立開來,使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口括堤,更不必知道請(qǐng)求是怎么被接收碌秸,以及操作是否被執(zhí)行、何時(shí)被執(zhí)行悄窃,以及是怎么被執(zhí)行的讥电。
  • 命令模式使請(qǐng)求本身成為一個(gè)對(duì)象,這個(gè)對(duì)象和其他對(duì)象一樣可以被存儲(chǔ)和傳遞轧抗。
  • 命令模式的關(guān)鍵在于引入了抽象命令接口恩敌,且發(fā)送者針對(duì)抽象命令接口編程,只有實(shí)現(xiàn)了抽象命令接口的具體命令才能與接收者相關(guān)聯(lián)横媚。

六纠炮、優(yōu)點(diǎn)

命令模式的優(yōu)點(diǎn)

  • 降低系統(tǒng)的耦合度月趟。
  • 新的命令可以很容易地加入到系統(tǒng)中。
  • 可以比較容易地設(shè)計(jì)一個(gè)命令隊(duì)列和宏命令(組合命令)恢口。
  • 可以方便地實(shí)現(xiàn)對(duì)請(qǐng)求的Undo和Redo孝宗。

七、缺點(diǎn)

命令模式的缺點(diǎn)

  • 使用命令模式可能會(huì)導(dǎo)致某些系統(tǒng)有過多的具體命令類耕肩。因?yàn)獒槍?duì)每一個(gè)命令都需要設(shè)計(jì)一個(gè)具體命令類因妇,因此某些系統(tǒng)可能需要大量具體命令類,這將影響命令模式的使用看疗。

八沙峻、適用環(huán)境

在以下情況下可以使用命令模式:

  • 系統(tǒng)需要將請(qǐng)求調(diào)用者和請(qǐng)求接收者解耦,使得調(diào)用者和接收者不直接交互两芳。
  • 系統(tǒng)需要在不同的時(shí)間指定請(qǐng)求摔寨、將請(qǐng)求排隊(duì)和執(zhí)行請(qǐng)求。
  • 系統(tǒng)需要支持命令的撤銷(Undo)操作和恢復(fù)(Redo)操作怖辆。
  • 系統(tǒng)需要將一組操作組合在一起是复,即支持宏命令

九、模式應(yīng)用

很多系統(tǒng)都提供了宏命令功能竖螃,如UNIX平臺(tái)下的Shell編程淑廊,可以將多條命令封裝在一個(gè)命令對(duì)象中,只需要一條簡(jiǎn)單的命令即可執(zhí)行一個(gè)命令序列特咆,這也是命令模式的應(yīng)用實(shí)例之一季惩。

十、模式擴(kuò)展

宏命令又稱為組合命令腻格,它是命令模式和組合模式聯(lián)用的產(chǎn)物画拾。

  • 宏命令也是一個(gè)具體命令,不過它包含了對(duì)其他命令對(duì)象的引用菜职,在調(diào)用宏命令的execute()方法時(shí)青抛,將遞歸調(diào)用它所包含的每個(gè)成員命令的execute()方法,一個(gè)宏命令的成員對(duì)象可以是簡(jiǎn)單命令酬核,還可以繼續(xù)是宏命令蜜另。執(zhí)行一個(gè)宏命令將執(zhí)行多個(gè)具體命令,從而實(shí)現(xiàn)對(duì)命令的批處理嫡意。

十一举瑰、總結(jié)

  • 在命令模式中,將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象蔬螟,從而使我們可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化此迅;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及支持可撤銷的操作。命令模式是一種對(duì)象行為型模式邮屁,其別名為動(dòng)作模式或事務(wù)模式整袁。
  • 命令模式包含四個(gè)角色:抽象命令類中聲明了用于執(zhí)行請(qǐng)求的execute()等方法,通過這些方法可以調(diào)用請(qǐng)求接收者的相關(guān)操作佑吝;具體命令類是抽象命令類的子類坐昙,實(shí)現(xiàn)了在抽象命令類中聲明的方法,它對(duì)應(yīng)具體的接收者對(duì)象芋忿,將接收者對(duì)象的動(dòng)作綁定其中炸客;調(diào)用者即請(qǐng)求的發(fā)送者,又稱為請(qǐng)求者戈钢,它通過命令對(duì)象來執(zhí)行請(qǐng)求痹仙;接收者執(zhí)行與請(qǐng)求相關(guān)的操作,它具體實(shí)現(xiàn)對(duì)請(qǐng)求的業(yè)務(wù)處理殉了。
  • 命令模式的本質(zhì)是對(duì)命令進(jìn)行封裝开仰,將發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開。命令模式使請(qǐng)求本身成為一個(gè)對(duì)象薪铜,這個(gè)對(duì)象和其他對(duì)象一樣可以被存儲(chǔ)和傳遞众弓。
    命令模式的主要優(yōu)點(diǎn)在于降低系統(tǒng)的耦合度,增加新的命令很方便隔箍,而且可以比較容易地設(shè)計(jì)一個(gè)命令隊(duì)列和宏命令谓娃,并方便地實(shí)現(xiàn)對(duì)請(qǐng)求的撤銷和恢復(fù);其主要缺點(diǎn)在于可能會(huì)導(dǎo)致某些系統(tǒng)有過多的具體命令類蜒滩。
  • 命令模式適用情況包括:需要將請(qǐng)求調(diào)用者和請(qǐng)求接收者解耦滨达,使得調(diào)用者和接收者不直接交互;需要在不同的時(shí)間指定請(qǐng)求俯艰、將請(qǐng)求排隊(duì)和執(zhí)行請(qǐng)求捡遍;需要支持命令的撤銷操作和恢復(fù)操作,需要將一組操作組合在一起蟆炊,即支持宏命令稽莉。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瀑志,一起剝皮案震驚了整個(gè)濱河市涩搓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劈猪,老刑警劉巖昧甘,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異战得,居然都是意外死亡充边,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浇冰,“玉大人贬媒,你說我怎么就攤上這事≈庀埃” “怎么了际乘?”我有些...
    開封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)漂佩。 經(jīng)常有香客問我脖含,道長(zhǎng),這世上最難降的妖魔是什么投蝉? 我笑而不...
    開封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任养葵,我火速辦了婚禮,結(jié)果婚禮上瘩缆,老公的妹妹穿的比我還像新娘关拒。我一直安慰自己,他們只是感情好庸娱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開白布夏醉。 她就那樣靜靜地躺著,像睡著了一般涌韩。 火紅的嫁衣襯著肌膚如雪畔柔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天臣樱,我揣著相機(jī)與錄音靶擦,去河邊找鬼。 笑死雇毫,一個(gè)胖子當(dāng)著我的面吹牛玄捕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棚放,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼枚粘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了飘蚯?” 一聲冷哼從身側(cè)響起馍迄,我...
    開封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎局骤,沒想到半個(gè)月后攀圈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峦甩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年赘来,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡犬辰,死狀恐怖嗦篱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幌缝,我是刑警寧澤默色,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站狮腿,受9級(jí)特大地震影響腿宰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缘厢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一吃度、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贴硫,春花似錦椿每、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挖诸,卻和暖如春汁尺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背多律。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來泰國打工痴突, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狼荞。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓辽装,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親相味。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拾积,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問題# 1.1 如何開機(jī)## 估計(jì)有些朋友看到這個(gè)標(biāo)題會(huì)非常奇怪,電腦裝配好了丰涉,如何開機(jī)拓巧?不就是按下啟動(dòng)按...
    七寸知架構(gòu)閱讀 2,820評(píng)論 1 59
  • 目錄 本文的結(jié)構(gòu)如下: 什么是命令模式 為什么要用該模式 模式的結(jié)構(gòu) 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 總...
    w1992wishes閱讀 1,102評(píng)論 2 9
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,934評(píng)論 6 13
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用昔搂、多...
    MinoyJet閱讀 3,922評(píng)論 1 15
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品玲销,去做同樣的事情输拇,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式摘符。簡(jiǎn)單...
    舟漁行舟閱讀 7,729評(píng)論 2 17