您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java命令設計模式怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java命令設計模式怎么實現”吧!
Java命令模式(Command Pattern)是一種行為型設計模式,它將請求封裝成一個對象,從而使不同的請求可以進行參數化,并支持請求的排隊,記錄日志,撤銷操作等.
在命令模式中,將命令請求者(Invoker),命令接收者(Receiver)和命令對象(Command)進行了解耦,使得它們可以獨立地變化.具體的說,命令對象封裝了一個特定的請求和其對應的操作,Invoker對象負責調用命令來執行請求,而Receiver對象則負責實際執行命令所代表的操作.
在Java中,可以通過定義一個接口來定義命令對象的基本行為,然后再定義具體的命令對象實現該接口.Invoker對象可以包含一個或多個命令對象,可以通過調用命令對象的execute()方法來執行相應的命令.而Receiver對象則負責實際執行命令所代表的操作,其具體實現可以再命令對象的execute()方法中調用.
命令對象接口
public interface Command { /** * 執行 */ void execute(); /** * 撤銷 */ void undo(); }
具體命令對象
public class ConcreteCommand1 implements Command { private Receiver receiver; private boolean isExecute; public ConcreteCommand1(Receiver receiver) { this.receiver = receiver; } /** * 執行 */ @Override public void execute() { receiver.action1(); isExecute = true; } /** * 撤銷 */ @Override public void undo() { if (isExecute) { receiver.undoAction1(); isExecute = false; } } } public class ConcreteCommand2 implements Command { private Receiver receiver; private boolean isExecute; public ConcreteCommand2(Receiver receiver) { this.receiver = receiver; } /** * 執行 */ @Override public void execute() { receiver.action2(); isExecute = true; } /** * 撤銷 */ @Override public void undo() { if (isExecute) { receiver.undoAction2(); isExecute = false; } } }
命令接收者
public class Receiver { public void action1() { System.out.println("Receiver.action1() 被調用..."); } public void action2() { System.out.println("Receiver.action2() 被調用..."); } public void undoAction1(){ System.out.println("Receiver.undoAction1() 被調用..."); } public void undoAction2(){ System.out.println("Receiver.undoAction2() 被調用..."); } }
命令請求者
public class Invoker { private List<Command> commandList = new ArrayList<>(); /** * 添加命令 * * @param command */ public void addCommand(Command command) { commandList.add(command); } /** * 執行命令 */ public void executeCommands() { commandList.forEach(Command::execute); } /** * 撤銷命令 */ public void undoCommands() { for (int i = commandList.size() - 1; i >= 0; i--) { commandList.get(i).undo(); } } }
測試
public class Demo { public static void main(String[] args) { Receiver receiver = new Receiver(); Command command1 = new ConcreteCommand1(receiver); Command command2 = new ConcreteCommand2(receiver); Invoker invoker = new Invoker(); invoker.addCommand(command1); invoker.addCommand(command2); invoker.executeCommands(); invoker.undoCommands(); } }
再示例代碼中,定義了兩個具體的命令對象實現,分別是ConcreteCommand1和ConcreteCommand2,它們都實現了Command接口,并且支持撤銷操作.每個ConcreteCommand對象內部維護了一個boolean類型的isExecute變量,表示該命令是否已經執行過.如果execute()方法中,執行具體的命令操作,并將isExecute設為true.再undo()方法中,如果該命令已經執行過,則執行與execute()方法相反的操作,并將isExecute設為false.Receiver類是命令接收者,它實際執行命令所代表的操作.Invoker類中包含了一個Command對象列表,它通過addCommand()方法向其中添加具體的Command對象,executeCommand()用于執行所有添加的Command對象,而undoCommands()方法則用于撤銷所有添加的Command對象,執行與撤銷的順序正好相反.
感謝各位的閱讀,以上就是“Java命令設計模式怎么實現”的內容了,經過本文的學習后,相信大家對Java命令設計模式怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。