詳解Java設計模式編程中命令模式的項目結構實現(xiàn)
正論:
命令模式把一個請求或者操作封裝到一個對象中。命令模式運行系統(tǒng)使用不同的請求把客戶端參數(shù)化,對請求排隊或者記錄請求日志,可以提供命令的撤銷和恢復功能。
通俗:
其實很好理解。命令模式,關心的就是命令(或者稱為操作)。打個比方。在一個公司里面,整個運作就像一個系統(tǒng)。某個boss發(fā)布了一個命令,中層領導接到這個命令,然后指派給具體負責這個員工。整個流程很清晰吧。有一個需求,如何將這個流程固定下來,形成一個系統(tǒng)。我們只要抓住了重點:命令。將它抽取出來,其他的都迎刃而解了。抽取出命令,封裝成一個獨立的對象,實現(xiàn)了解耦。至于其他的,可以方便地擴展,不論這個命令是CEO,人事部,還是你爸提出來的。無論這個命令的執(zhí)行者是張三還是王八。這個模式的產生,其實是哲學上的“抓住主要矛盾”。更多的例子,如其他作家舉的“去路邊吃烤肉和去烤肉店吃烤肉有什么不同”或者“美猴王大鬧天宮中玉帝拍太白金星捉來猴子”。
Java命令模式本質是對命令的封裝,從而把發(fā)出命令的責任和執(zhí)行命令的責任分割開了,委派給不同的對象。通俗地說,我是老總,我只管發(fā)個命令,至于這個命令發(fā)給誰,誰執(zhí)行,關我P事,我發(fā)錢請人不是為了給自己找麻煩。你是負責事情的員工,你的天職是做好上級交給你的任務,踏踏實實,不要知道太多,不要八卦,不要問太多了。
實現(xiàn):
我們先來看一下類圖:

根據這個我們來看示例代碼:
public interface ICommand {
void execute();
}
public class ConcreteCommand implements ICommand {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
this.receiver.action();
}
}
public class Receiver {
public void action() {
System.out.println("receiver do something");
}
}
public class Invoker {
private ICommand command;
public Invoker(ICommand command) {
this.command = command;
}
public void invoke() {
this.command.execute();
}
}
public class Test {
public static void main(String[] args) {
Receiver receiver = new Receiver();//真正的執(zhí)行者
ICommand command = new ConcreteCommand(receiver);//用于的隔離的命令
Invoker invoker = new Invoker(command );//調用者
invoker.invoke();
}
}
優(yōu)點:
- 很容易構造一個命令隊列
- 記錄相關的命令日志
- 增加命令的狀態(tài),實現(xiàn)命令的撤銷和重做
- 允許接受請求的一方決定是否可做
- 新的命令輕而易舉可以加入其中
缺點:
可能會有過多的具體命令類存在。
相關文章
Hadoop MultipleOutputs輸出到多個文件中的實現(xiàn)方法
這篇文章主要介紹了 Hadoop MultipleOutputs輸出到多個文件中的實現(xiàn)方法的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10
springboot 使用yml配置文件給靜態(tài)變量賦值教程
這篇文章主要介紹了springboot 使用yml配置文件給靜態(tài)變量賦值教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
mybatis-plus通用枚舉@JsonValue接收參數(shù)報錯No enum constant
最近在使用mybatis-plus時用到了通用枚舉,遇到了問題,本文主要介紹了mybatis-plus通用枚舉@JsonValue接收參數(shù)報錯No enum constant,具有一定的參考價值,感興趣的可以了解一下2023-09-09

