詳解Java設(shè)計(jì)模式編程中命令模式的項(xiàng)目結(jié)構(gòu)實(shí)現(xiàn)
正論:
命令模式把一個(gè)請求或者操作封裝到一個(gè)對象中。命令模式運(yùn)行系統(tǒng)使用不同的請求把客戶端參數(shù)化,對請求排隊(duì)或者記錄請求日志,可以提供命令的撤銷和恢復(fù)功能。
通俗:
其實(shí)很好理解。命令模式,關(guān)心的就是命令(或者稱為操作)。打個(gè)比方。在一個(gè)公司里面,整個(gè)運(yùn)作就像一個(gè)系統(tǒng)。某個(gè)boss發(fā)布了一個(gè)命令,中層領(lǐng)導(dǎo)接到這個(gè)命令,然后指派給具體負(fù)責(zé)這個(gè)員工。整個(gè)流程很清晰吧。有一個(gè)需求,如何將這個(gè)流程固定下來,形成一個(gè)系統(tǒng)。我們只要抓住了重點(diǎn):命令。將它抽取出來,其他的都迎刃而解了。抽取出命令,封裝成一個(gè)獨(dú)立的對象,實(shí)現(xiàn)了解耦。至于其他的,可以方便地?cái)U(kuò)展,不論這個(gè)命令是CEO,人事部,還是你爸提出來的。無論這個(gè)命令的執(zhí)行者是張三還是王八。這個(gè)模式的產(chǎn)生,其實(shí)是哲學(xué)上的“抓住主要矛盾”。更多的例子,如其他作家舉的“去路邊吃烤肉和去烤肉店吃烤肉有什么不同”或者“美猴王大鬧天宮中玉帝拍太白金星捉來猴子”。
Java命令模式本質(zhì)是對命令的封裝,從而把發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開了,委派給不同的對象。通俗地說,我是老總,我只管發(fā)個(gè)命令,至于這個(gè)命令發(fā)給誰,誰執(zhí)行,關(guān)我P事,我發(fā)錢請人不是為了給自己找麻煩。你是負(fù)責(zé)事情的員工,你的天職是做好上級交給你的任務(wù),踏踏實(shí)實(shí),不要知道太多,不要八卦,不要問太多了。
實(shí)現(xiàn):
我們先來看一下類圖:
根據(jù)這個(gè)我們來看示例代碼:
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 );//調(diào)用者 invoker.invoke(); } }
優(yōu)點(diǎn):
- 很容易構(gòu)造一個(gè)命令隊(duì)列
- 記錄相關(guān)的命令日志
- 增加命令的狀態(tài),實(shí)現(xiàn)命令的撤銷和重做
- 允許接受請求的一方?jīng)Q定是否可做
- 新的命令輕而易舉可以加入其中
缺點(diǎn):
可能會(huì)有過多的具體命令類存在。
相關(guān)文章
Hadoop MultipleOutputs輸出到多個(gè)文件中的實(shí)現(xiàn)方法
這篇文章主要介紹了 Hadoop MultipleOutputs輸出到多個(gè)文件中的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10springboot 使用yml配置文件給靜態(tài)變量賦值教程
這篇文章主要介紹了springboot 使用yml配置文件給靜態(tài)變量賦值教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04MyBatis自定義類型轉(zhuǎn)換器實(shí)現(xiàn)加解密
這篇文章主要介紹了MyBatis自定義類型轉(zhuǎn)換器實(shí)現(xiàn)加解密的相關(guān)資料,需要的朋友可以參考下2016-07-07mybatis-plus通用枚舉@JsonValue接收參數(shù)報(bào)錯(cuò)No enum constant
最近在使用mybatis-plus時(shí)用到了通用枚舉,遇到了問題,本文主要介紹了mybatis-plus通用枚舉@JsonValue接收參數(shù)報(bào)錯(cuò)No enum constant,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09基于SpringBoot構(gòu)建電商秒殺項(xiàng)目代碼實(shí)例
這篇文章主要介紹了基于SpringBoot構(gòu)建電商秒殺項(xiàng)目代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Ubuntu安裝jenkins完成自動(dòng)化構(gòu)建詳細(xì)步驟
Jenkins是一個(gè)開源的自動(dòng)化服務(wù)器,可以用來輕松地建立持續(xù)集成和持續(xù)交付(CI/CD)管道,這篇文章主要給大家介紹了關(guān)于Ubuntu安裝jenkins完成自動(dòng)化構(gòu)建的相關(guān)資料,需要的朋友可以參考下2024-03-03