Java設(shè)計模式----命令模式

介紹

將一個請求封裝為一個對象,從而使我們可用不同的請求對客戶進行參數(shù)化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作匙奴。也稱之為:動作(Action)模式堆巧、事物(transaction)模式

結(jié)構(gòu)

  • Command抽象命令類
  • ConcreteCommand具體命令類
  • Invoker調(diào)用者/請求者
    請求的發(fā)送者,它通過命令對象來執(zhí)行請求泼菌。一個調(diào)用者并不需要在設(shè)計時確定其接收者谍肤,因此它只與抽象命令類之間存在關(guān)聯(lián)。在程序運行時哗伯,將調(diào)用命令對象的execute(),間接調(diào)用接收者的相關(guān)操作荒揣。
  • Receiver接收者
    接收者執(zhí)行與請求相關(guān)的操作,具體實現(xiàn)對請求的業(yè)務(wù)處理。
    未抽象前焊刹,實際執(zhí)行操作內(nèi)容的對象系任。
  • Client客戶類
    在客戶類中需要創(chuàng)建調(diào)用者對象、具體命令類對象虐块,在創(chuàng)建具體命令對象時指定對應(yīng)的接收者俩滥。發(fā)送和接收者之間沒有直接關(guān)系,都通過命令對象間接調(diào)用贺奠。


    命令模式
package command;

public class Receiver {
    public void action(){
        System.out.println("Receiver.action()");
    }
}
package command;

public interface Command {
    // 實際項目中,可以根據(jù)需求設(shè)計多個不同的方法
    void execute();
}


class ConcreteCommand implements Command{
    private Receiver receiver;      // 命令正真的執(zhí)行者

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

    public void execute() {
        // 可以在命令正真執(zhí)行前后,執(zhí)行相關(guān)處理
        receiver.action();
    }
}
package command;

public class Invoker {
    private Command command;    //也可以通過容器List<Command>容納多個命令對象,進行批處理

    public Invoker(Command command) {
        this.command = command;
    }

    // 業(yè)務(wù)方法,用于調(diào)用命令類的方法
    public void call(){
        command.execute();
    }
}
package command;

public class Client {
    public static void main(String[] args) {
        Command command = new ConcreteCommand(new Receiver());

        Invoker invoker = new Invoker(command);

        invoker.call();
    }
}

開發(fā)中常見的場景

  • Struts2中霜旧,action的整個調(diào)用過程中就有命令模式。
  • 數(shù)據(jù)庫事物機制的底層實現(xiàn)
  • 命令的撤銷和恢復(fù)

優(yōu)點

  • 它能比較容易地設(shè)計一個命令隊列儡率;
  • 在需要的情況下挂据,可以較容易地將命令記入日志;
  • 允許接收請求的一方?jīng)Q定是否要否決請求儿普;
  • 可以容易地實現(xiàn)對請求的撤銷和重做崎逃;
  • 由于加進新的具體命令類不影響其他類,因此增加新的具體命令類很容易箕肃;
  • 命令模式吧請求一個操作的對象與知道怎么執(zhí)行一個操作的對象分割開婚脱;
    敏捷開發(fā)原則告訴我們,不要為代碼添加基于猜測的、實際不需要的功能勺像。如果不清楚一個系統(tǒng)是否需要命令模式障贸,一般就不要著急去實現(xiàn)它,事實上吟宦,在需要的時候通過重構(gòu)實現(xiàn)這個模式并不困難篮洁,只有在真正需要如撤銷/恢復(fù)操作等功能時,把原來的代碼重構(gòu)為命令模式才有意義。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末殃姓,一起剝皮案震驚了整個濱河市袁波,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜗侈,老刑警劉巖篷牌,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異踏幻,居然都是意外死亡枷颊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門该面,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夭苗,“玉大人,你說我怎么就攤上這事隔缀√庠欤” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵猾瘸,是天一觀的道長界赔。 經(jīng)常有香客問我,道長牵触,這世上最難降的妖魔是什么仔蝌? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮荒吏,結(jié)果婚禮上敛惊,老公的妹妹穿的比我還像新娘。我一直安慰自己绰更,他們只是感情好瞧挤,可當(dāng)我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著儡湾,像睡著了一般特恬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徐钠,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天癌刽,我揣著相機與錄音,去河邊找鬼。 笑死显拜,一個胖子當(dāng)著我的面吹牛衡奥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播远荠,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼矮固,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了譬淳?” 一聲冷哼從身側(cè)響起档址,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邻梆,沒想到半個月后守伸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡浦妄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年尼摹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片校辩。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡窘问,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宜咒,到底是詐尸還是另有隱情惠赫,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布故黑,位于F島的核電站儿咱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏场晶。R本人自食惡果不足惜混埠,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诗轻。 院中可真熱鬧钳宪,春花似錦、人聲如沸扳炬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恨樟。三九已至半醉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劝术,已是汗流浹背缩多。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工呆奕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衬吆。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓梁钾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咆槽。 傳聞我的和親對象是個殘疾皇子陈轿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,499評論 2 348

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