Android的設計模式-命令模式

前言

Android的設計模式系列文章介紹,歡迎關注,持續(xù)更新中:

Android的設計模式-設計模式的六大原則
一句話總結(jié)23種設計模式則
創(chuàng)建型模式:
Android的設計模式-單例模式
Android的設計模式-建造者模式
Android的設計模式-工廠方法模式
Android的設計模式-簡單工廠模式
Android的設計模式-抽象工廠模式
Android的設計模式-原型模式
行為型模式:
Android的設計模式-策略模式
Android的設計模式-狀態(tài)模式
Android的設計模式-責任鏈模式
Android的設計模式-觀察者模式
Android的設計模式-模板方法模式
Android的設計模式-迭代器模式
Android的設計模式-備忘錄模式
Android的設計模式-訪問者模式
Android的設計模式-中介者模式
Android的設計模式-解釋器模式
Android的設計模式-命令模式
結(jié)構(gòu)型模式:
Android的設計模式-代理模式
Android的設計模式-組合模式
Android的設計模式-適配器模式
Android的設計模式-裝飾者模式
Android的設計模式-享元模式
Android的設計模式-外觀模式
Android的設計模式-橋接模式

1.定義

將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數(shù)化,對請求排隊或者記錄日志,可以提供命令的撤銷和恢復功能。

2.介紹

  • 命令模式屬于行為型模式。
  • 我們遇到最常見的命令模式就是關機操作了,我們只需點擊一下關機按鈕就可以了,至于計算機是如何關機的,我們不需要關心其實現(xiàn)細節(jié)。

3.UML類圖

命令模式UML類圖.jpg
角色說明:
  • Command(命令角色):接口或者抽象類,定義要執(zhí)行的命令。
  • ConcreteCommand(具體命令角色):命令角色的具體實現(xiàn),通常會持有接收者,并調(diào)用接收者來處理命令。
  • Invoker(調(diào)用者角色):負責調(diào)用命令對象執(zhí)行請求,通常會持有命令對象(可以持有多個命令對象)。Invoker是Client真正觸發(fā)命令并要求命令執(zhí)行相應操作的地方(使用命令對象的入口)。
  • Receiver(接收者角色):是真正執(zhí)行命令的對象。任何類都可能成為一個接收者,只要它能夠?qū)崿F(xiàn)命令要求實現(xiàn)的相應功能。
  • Client(客戶端角色):Client可以創(chuàng)建具體的命令對象,并且設置命令對象的接收者。

4.實現(xiàn)

就以關機為例子來實現(xiàn)命令模式。

4.1 創(chuàng)建命令角色

定義一個抽象的執(zhí)行方法:

    public interface Command {
        void execute();//執(zhí)行命令
    }
4.2 創(chuàng)建具體命令角色

創(chuàng)建一個關機命令:

    public class ShutdownCommand implements Command {//關機命令
        private Receiver receiver;//接受者

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

        @Override
        public void execute() {
            System.out.println("命令角色執(zhí)行關機命令");
            receiver.action();//調(diào)用接受者
        }
    }
4.3 創(chuàng)建調(diào)用者角色
     public class Invoker {//調(diào)用者
        private Command command;

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

        public void action() {
            System.out.println("調(diào)用者執(zhí)行命令");
            command.execute();
        }
    }
4.4 創(chuàng)建接收者角色

執(zhí)行具體的關機操作:

    public class Receiver {
        public void action() {//接收者執(zhí)行具體的操作
            System.out.println("接收者執(zhí)行具體的操作");
            System.out.println("開始執(zhí)行關機操作:");
            System.out.println("退出所有程序進程");
            System.out.println("關機~");
        }
    }
4.5 客戶端測試:
     public void test() {
        Receiver receiver = new Receiver();//創(chuàng)建命令接收者
        Command command = new ShutdownCommand(receiver);//創(chuàng)建一個命令的具體實現(xiàn)對象,并指定命令接收者
        Invoker invoker = new Invoker(command);//創(chuàng)建一個命令調(diào)用者,并指定具體命令
        invoker.action();//發(fā)起調(diào)用命令請求
    }
輸出結(jié)果:
調(diào)用者執(zhí)行命令
命令角色執(zhí)行關機命令
接收者執(zhí)行具體的操作
開始執(zhí)行關機操作:
退出所有程序進程
關機~
4.6 說明:
  • 命令模式同時也支持命令的撤銷(Undo)操作和恢復(Redo)操作,比如我們平時關機時,也是可以撤銷關機的。至于恢復操作,需要我們記下執(zhí)行過的命令,在需要的時候重新執(zhí)行一遍。

5. 應用場景

  • 需要對行為進行記錄,撤銷,重做,事務處理時。
  • 對于大多數(shù)請求——響應模式的功能,比較適合使用命令模式。

6. 優(yōu)點

  • 調(diào)用者與接受者之間的解藕。
  • 易于擴展,擴展命令只需新增具體命令類即可,符合開放封閉原則。

7. 缺點

  • 過多的命令會造成過多的類。

8. Android中的源碼分析

8.1 線程類

實際上Thread的使用就是一個簡單的命令模式,先看下Thread的使用:

        new Thread(new Runnable() {
            @Override
            public void run() {
                //doSomeThing
            }
        }).start();

Threadstart()方法即命令的調(diào)用者,同時Thread的內(nèi)部會調(diào)用Runnablerun(),這里Thread又充當了具體的命令角色,最后的Runnable則是接受者了,負責最后的功能處理。

8.2 Handler

另一個比較典型的常用到命令模式就是Handler了,這里就不貼代碼了,簡單分析下各個類的角色:

  • 接受者:Handler,執(zhí)行消息的處理操作。
  • 調(diào)用者:Looper,調(diào)用消息的的處理方法。
  • 命令角色:Message,消息類。

相關文章閱讀
Android的設計模式-設計模式的六大原則
一句話總結(jié)23種設計模式則
創(chuàng)建型模式:
Android的設計模式-單例模式
Android的設計模式-建造者模式
Android的設計模式-工廠方法模式
Android的設計模式-簡單工廠模式
Android的設計模式-抽象工廠模式
Android的設計模式-原型模式
行為型模式:
Android的設計模式-策略模式
Android的設計模式-狀態(tài)模式
Android的設計模式-責任鏈模式
Android的設計模式-觀察者模式
Android的設計模式-模板方法模式
Android的設計模式-迭代器模式
Android的設計模式-備忘錄模式
Android的設計模式-訪問者模式
Android的設計模式-中介者模式
Android的設計模式-解釋器模式
Android的設計模式-命令模式
結(jié)構(gòu)型模式:
Android的設計模式-代理模式
Android的設計模式-組合模式
Android的設計模式-適配器模式
Android的設計模式-裝飾者模式
Android的設計模式-享元模式
Android的設計模式-外觀模式
Android的設計模式-橋接模式

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379