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

前言

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

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

1.定義

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

2.介紹

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

3.UML類(lèi)圖

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

4.實(shí)現(xiàn)

就以關(guān)機(jī)為例子來(lái)實(shí)現(xiàn)命令模式。

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

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

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

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

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

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

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

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

5. 應(yīng)用場(chǎng)景

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

6. 優(yōu)點(diǎn)

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

7. 缺點(diǎn)

  • 過(guò)多的命令會(huì)造成過(guò)多的類(lèi)。

8. Android中的源碼分析

8.1 線程類(lèi)

實(shí)際上Thread的使用就是一個(gè)簡(jiǎn)單的命令模式,先看下Thread的使用:

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

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

8.2 Handler

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

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

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

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

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