命令模式簡介
定義
將一個(gè)請求封裝成一個(gè)對象,從而讓用戶使用不同的請求把客戶端參數(shù)化,對請求排隊(duì)或記錄請求日志,以及支持可撤銷的操作
優(yōu)點(diǎn)(摘自大話設(shè)計(jì)模式)
(1)比較容易地設(shè)計(jì)一個(gè)命令隊(duì)列
(2)在需要的情況下,可以比較容易地將命令記入日志
(3)允許接受請求的以放決定是否要否決請求
(4)可以容易地實(shí)現(xiàn)對請求的撤銷和重做,新增加的具體命令類不影響其他類
使用場景
需要抽象出待執(zhí)行的操作,然后以參數(shù)的形式提供出來,類似于過程設(shè)計(jì)中的回調(diào)機(jī)制,而命令模式正式回調(diào)機(jī)制的一個(gè)面向?qū)ο蟮奶娲?br />
需要支持事務(wù)操作
實(shí)例
根據(jù)上面的介紹,命令模式需要一個(gè)命令的接口類+具體的命令類+命令的管理或調(diào)度類+執(zhí)行者
public interface Command {
void execute();
}
具體命令
public class ConcreteCommand implements Command{
Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action();
System.out.println("執(zhí)行了具體命令");
}
}
命令接收者
public class Receiver {
String name;
public Receiver(String name) {
this.name = name;
}
public void action() {
System.out.print(name);
}
}
public class Invoker {
List<Command> commands;
public void addCommands(Command command) {
if (commands == null)
commands = new ArrayList<>();
commands.add(command);
}
public void cancelCommand(Command command) {
if (commands == null || commands.isEmpty()) return;
commands.remove(command);
}
public void execute() {
if (commands == null || commands.isEmpty()) return;
for (Command command : commands) {
command.execute();
}
}
}
測試調(diào)用類
public class Test {
public static void main(String[] args) {
Receiver receiver=new Receiver("小明");
ConcreteCommand concreteCommand=new ConcreteCommand(receiver);
Invoker invoker=new Invoker();
invoker.addCommands(concreteCommand);
invoker.execute();
}
}
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺(tái),網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對作者和來源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對此聲明的最終解釋權(quán)。