Android的設(shè)計模式-命令模式

前言

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

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

1.定義

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

2.介紹

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

3.UML類圖

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

4.實現(xiàn)

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

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

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

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

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

    public class ShutdownCommand implements Command {//關(guān)機命令
        private Receiver receiver;//接受者

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

        @Override
        public void execute() {
            System.out.println("命令角色執(zhí)行關(guān)機命令");
            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í)行具體的關(guān)機操作:

    public class Receiver {
        public void action() {//接收者執(zhí)行具體的操作
            System.out.println("接收者執(zhí)行具體的操作");
            System.out.println("開始執(zhí)行關(guān)機操作:");
            System.out.println("退出所有程序進程");
            System.out.println("關(guān)機~");
        }
    }
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í)行關(guān)機命令
接收者執(zhí)行具體的操作
開始執(zhí)行關(guān)機操作:
退出所有程序進程
關(guān)機~
4.6 說明:
  • 命令模式同時也支持命令的撤銷(Undo)操作和恢復(fù)(Redo)操作,比如我們平時關(guān)機時,也是可以撤銷關(guān)機的。至于恢復(fù)操作,需要我們記下執(zhí)行過的命令,在需要的時候重新執(zhí)行一遍。

5. 應(yīng)用場景

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

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又充當(dāng)了具體的命令角色,最后的Runnable則是接受者了,負責(zé)最后的功能處理。

8.2 Handler

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

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

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

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

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