前言
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類圖
角色說明:
- 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();
Thread
的start()
方法即命令的調(diào)用者,同時Thread
的內(nèi)部會調(diào)用Runnable
的run()
,這里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的設計模式-橋接模式