前言
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)圖

角色說(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();
Thread的start()方法即命令的調(diào)用者,同時(shí)Thread的內(nèi)部會(huì)調(diào)用Runnable的run(),這里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ì)模式-橋接模式