JavaEE進(jìn)階知識(shí)學(xué)習(xí)-----設(shè)計(jì)模式---命令模式

命令模式定義

命令模式將請(qǐng)求封裝成對(duì)象,以便使用不同的請(qǐng)求茫船、隊(duì)列或者日志來(lái)參數(shù)化其他對(duì)象愿棋,命令模式支持可撤銷的操作。
命令模式可以對(duì)發(fā)送者和接受者完全解耦诈嘿,發(fā)送者和接收者之間沒(méi)有直接的聯(lián)系堪旧,發(fā)送者只需要知道如何發(fā)送請(qǐng)求,不需要關(guān)心請(qǐng)求如何完成奖亚,這就是命令模式崎场,命令模式將方法的調(diào)用給封裝起來(lái)了。

命令模式結(jié)構(gòu)

image

說(shuō)明:上圖中的Command:抽象命令類遂蛀,ConcreteCommand:具體命令類谭跨,Invoker:調(diào)用者,Receiver:接受者,Client:客戶類螃宙。命令的模式本質(zhì)就在于將命令進(jìn)行封裝蛮瞄,將發(fā)出的命令測(cè)責(zé)任和執(zhí)行命令的責(zé)任分開,發(fā)送者只需要知道如何發(fā)送指令即可谆扎,不需要知道命令如何實(shí)現(xiàn)的挂捅,甚至執(zhí)行是否成功都不需要知道,命令模式將請(qǐng)求也變?yōu)橐粋€(gè)對(duì)象堂湖,它和其他對(duì)象一樣可以被存儲(chǔ)和傳遞闲先。

命令模式的實(shí)現(xiàn)

在這里,我們以電視機(jī)為例无蜂,電視劇是請(qǐng)求的接受者伺糠,遙控器是請(qǐng)求的發(fā)送者,遙控器上有一些按鈕斥季,不同的按鈕對(duì)應(yīng)不同的操作训桶,在這里遙控器需要執(zhí)行三個(gè)命令,打開電視酣倾,關(guān)閉電視舵揭,換臺(tái)。

類圖結(jié)構(gòu)如下

image

抽象命令接口

/**
 * 命令接口躁锡,為所有的命令聲明一個(gè)接口
 *@author lky
 *@date 2018年1月19日
 */
public interface Command {
    public void excute();
}

電視機(jī)類

/**
 * 電視機(jī)類
 *@author lky
 *@date 2018年1月19日
 */
public class Telvision {
    public void open(){
        System.out.println("打開電視機(jī)....");
    }
    
    public void close(){
        System.out.println("關(guān)閉電視機(jī)....");
    }
    
    public void changeChannel(){
        System.out.println("切換電視機(jī)頻道....");
    }
}

遙控器類

/**
 * 遙控器類
 *@author lky
 *@date 2018年1月19日
 */
public class Controller {
    private Command openTvCommand;
    private Command closeTvCommand;
    private Command changeTvCommand;
    public Controller(Command openTvCommand, Command closeTvCommand,
            Command changeTvCommand) {
        super();
        this.openTvCommand = openTvCommand;
        this.closeTvCommand = closeTvCommand;
        this.changeTvCommand = changeTvCommand;
    }
    
    public void open(){
        openTvCommand.excute();
    }
    
    public void close(){
        closeTvCommand.excute();
    }
    
    public void change(){
        changeTvCommand.excute();
    }
}

遙控器的打開按鈕類

/**
 * 遙控器的打開電視按鈕
 *@author lky
 *@date 2018年1月19日
 */
public class OpenTvCommand implements Command{
    private Telvision tv;
    
    public OpenTvCommand() {
        tv = new Telvision();
    }

    @Override
    public void excute() {
        tv.open();
    }

}

遙控器的換臺(tái)按鈕

/**
 * 遙控機(jī)換臺(tái)按鈕
 *@author lky
 *@date 2018年1月19日
 */
public class ChangeTvCommand implements Command{
    private Telvision tv;
    public ChangeTvCommand() {
        tv = new Telvision();
    }
    @Override
    public void excute() {
        tv.changeChannel();
        
    }

}

遙控器的關(guān)閉按鈕

public class CloseTvCommand implements Command{
    private Telvision tv;
    public CloseTvCommand() {
        tv = new Telvision();
    }

    @Override
    public void excute() {
        tv.close();
    }

}

客戶端

public class Client {
    public static void main(String[] args) {
        Command openCommand,closeCommand,changeCommand;
        
        openCommand = new OpenTvCommand();
        closeCommand = new CloseTvCommand();
        changeCommand = new ChangeTvCommand();
        
        Controller controller = new Controller(openCommand, closeCommand, changeCommand);
        
        controller.open();
        controller.change();
        controller.close();
        
        
    }

}

輸出結(jié)果

打開電視機(jī)....
切換電視機(jī)頻道....
關(guān)閉電視機(jī)....

為方便理解午绳,將代碼放在一起

[圖片上傳失敗...(image-3e5f5e-1519534651204)]

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

  1. 降低了系統(tǒng)的耦合度
  2. 新的命令可以很容易的添加進(jìn)去
  3. 使用命令模式可能會(huì)導(dǎo)致某些系統(tǒng)有過(guò)多的具體命令類

命令模式的使用場(chǎng)景

  1. 系統(tǒng)需要請(qǐng)求調(diào)用者和請(qǐng)求接受者解耦,使得調(diào)用者和接收者不會(huì)直接交互
  2. 系統(tǒng)需要在不同的時(shí)間指定請(qǐng)求映之,將請(qǐng)求排隊(duì)和執(zhí)行請(qǐng)求
  3. 系統(tǒng)需要支持命令的插銷和恢復(fù)操作
  4. 系統(tǒng)需要將一組操作組合在一起

總結(jié)

  1. 命令模式的本質(zhì)是將命令對(duì)象進(jìn)行封裝打包拦焚,將發(fā)出的命令的責(zé)任和執(zhí)行命令的責(zé)任進(jìn)行分割開。
  2. 命令模式中發(fā)送者只需要知道如何發(fā)送命令惕医,無(wú)需關(guān)心命令執(zhí)行的具體過(guò)程耕漱。
  3. 在發(fā)送者和接受者兩者之間是通過(guò)命令對(duì)象進(jìn)行溝通的,請(qǐng)求命令本身就當(dāng)做一個(gè)對(duì)象在兩者之間進(jìn)行傳遞抬伺,他封裝了接受者和一組動(dòng)作螟够。
  4. 命令模式支持撤銷操作。
  5. 命令模式隊(duì)列請(qǐng)求和日志請(qǐng)求峡钓。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妓笙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子能岩,更是在濱河造成了極大的恐慌寞宫,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拉鹃,死亡現(xiàn)場(chǎng)離奇詭異辈赋,居然都是意外死亡鲫忍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門钥屈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)悟民,“玉大人,你說(shuō)我怎么就攤上這事篷就∩淇鳎” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵竭业,是天一觀的道長(zhǎng)智润。 經(jīng)常有香客問(wèn)我,道長(zhǎng)未辆,這世上最難降的妖魔是什么窟绷? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮鼎姐,結(jié)果婚禮上钾麸,老公的妹妹穿的比我還像新娘更振。我一直安慰自己炕桨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布肯腕。 她就那樣靜靜地躺著献宫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪实撒。 梳的紋絲不亂的頭發(fā)上姊途,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音知态,去河邊找鬼捷兰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛负敏,可吹牛的內(nèi)容都是我干的贡茅。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼其做,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顶考!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起妖泄,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驹沿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蹈胡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渊季,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朋蔫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了却汉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斑举。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖病涨,靈堂內(nèi)的尸體忽然破棺而出富玷,到底是詐尸還是另有隱情,我是刑警寧澤既穆,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布赎懦,位于F島的核電站,受9級(jí)特大地震影響幻工,放射性物質(zhì)發(fā)生泄漏励两。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一囊颅、第九天 我趴在偏房一處隱蔽的房頂上張望当悔。 院中可真熱鬧,春花似錦踢代、人聲如沸盲憎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)饼疙。三九已至,卻和暖如春慕爬,著一層夾襖步出監(jiān)牢的瞬間窑眯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工医窿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留磅甩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓姥卢,卻偏偏與公主長(zhǎng)得像卷要,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隔显,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品却妨,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式括眠。簡(jiǎn)單...
    舟漁行舟閱讀 7,779評(píng)論 2 17
  • 目錄 本文的結(jié)構(gòu)如下: 什么是命令模式 為什么要用該模式 模式的結(jié)構(gòu) 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 總...
    w1992wishes閱讀 1,123評(píng)論 2 9
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,323評(píng)論 25 707
  • 99天金剛經(jīng)智慧28 2017年3月4日 感恩今天又開始了晨起彪标,感恩身體提醒我該早睡早起了,感恩外面鳥兒叫掷豺,特別有...
    樹下的金礦閱讀 211評(píng)論 0 0
  • 在這里放出原文鏈接地址 Part 4.1: 指定自定義詞匯 App 含有自定義詞匯時(shí), 應(yīng)該告知 Siri 這些自...
    李國(guó)安閱讀 1,683評(píng)論 1 6