【行为型模式】《大话设计模式》——读后感 (15)烤羊肉串引来的思考?——命令模式...
命令模式:將一個請求封裝為一個對象,從而使得你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤銷的操作【DP】
?
先看代碼吧:
Receiver:
package com.sjmx.command;public class Receiver {public void doSomething(){ System.out.println("接受者-業務邏輯處理"); } }?
Command:
package com.sjmx.command;public abstract class Command {public abstract void execute(); }ConcreteCommand:
package com.sjmx.command;public class ConcreteCommand extends Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}public void execute() {this.receiver.doSomething();} }Invoker:
package com.sjmx.command;public class Invoker {private Command command; public void setCommand(Command command) { this.command = command; } public void action(){ this.command.execute(); } }Client:
package com.sjmx.command;public class Client {public static void main(String[] args) {Receiver receiver = new Receiver();Command command = new ConcreteCommand(receiver);// 客戶端直接執行具體命令方式(此方式與類圖相符) command.execute();// 客戶端通過調用者來執行命令Invoker invoker = new Invoker();invoker.setCommand(command);invoker.action();} }?
1. 解決的問題
在軟件系統中,行為請求者與行為實現者通常是一種緊耦合的關系,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵御變化的緊耦合的設計就不太合適。
2. 模式中角色
2.1 抽象命令(Command):定義命令的接口,聲明執行的方法。
2.2 具體命令(ConcreteCommand):具體命令,實現要執行的方法,它通常是“虛”的實現;通常會有接收者,并調用接收者的功能來完成命令要執行的操作。
2.3 接收者(Receiver):真正執行命令的對象。任何類都可能成為一個接收者,只要能實現命令要求實現的相應功能。
? ?2.4 調用者(Invoker):要求命令對象執行請求,通常會持有命令對象,可以持有很多的命令對象。這個是客戶端真正觸發命令并要求命令執行相應操作的地方,也就是說相當于使用命令對象的入口。
2.5 客戶端(Client):命令由客戶端來創建,并設置命令的接收者。
?
4 模式分析
4.1 本質:對命令進行封裝,將發出命令與執行命令的責任分開。
4.2 每一個命令都是一個操作:請求的一方發出請求,要求執行一個操作;接收的一方收到請求,并執行操作。
4.3 請求方和接收方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否被執行、何時被執行,以及是怎么被執行的。
4.4 使請求本身成為一個對象,這個對象和其它對象一樣可以被存儲和傳遞。
4.5 命令模式的關鍵在于引入了抽象命令接口,且發送者針對抽象命令接口編程,只有實現了抽象命令接口的具體命令才能與接收者相關聯。
5. 模式總結
5.1 優點
5.1.1 解除了請求者與實現者之間的耦合,降低了系統的耦合度。
5.1.2 對請求排隊或記錄請求日志,支持撤銷操作。
5.1.3 可以容易地設計一個組合命令。
5.1.4 新命令可以容易地加入到系統中。
5.2 缺點
5.2.1 因為針對每一個命令都需要設計一個具體命令類,使用命令模式可能會導致系統有過多的具體命令類。
5.3 適用場景
5.3.1 當需要對行為進行“記錄、撤銷/重做”等處理時。
5.3.2 系統需要將請求者和接收者解耦,使得調用者和接收者不直接交互。
5.3.3 系統需要在不同時間指定請求、請求排隊和執行請求。
5.3.4 系統需要將一組操作組合在一起,即支持宏命令。
?
?
最近在搞微服務,其中hystrix技術底層代碼就用到了命令模式,有時間整理出來分享一下:
?
轉載于:https://www.cnblogs.com/chen1-kerr/p/7197944.html
總結
以上是生活随笔為你收集整理的【行为型模式】《大话设计模式》——读后感 (15)烤羊肉串引来的思考?——命令模式...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 案例001 (有四个数字:
- 下一篇: 《ASP.NET MVC企业实战》(一)