溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java命令設(shè)計(jì)模式怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2023-04-26 10:07:29 來(lái)源:億速云 閱讀:123 作者:zzz 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“Java命令設(shè)計(jì)模式怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java命令設(shè)計(jì)模式怎么實(shí)現(xiàn)”吧!

介紹

Java命令模式(Command Pattern)是一種行為型設(shè)計(jì)模式,它將請(qǐng)求封裝成一個(gè)對(duì)象,從而使不同的請(qǐng)求可以進(jìn)行參數(shù)化,并支持請(qǐng)求的排隊(duì),記錄日志,撤銷操作等.

在命令模式中,將命令請(qǐng)求者(Invoker),命令接收者(Receiver)和命令對(duì)象(Command)進(jìn)行了解耦,使得它們可以獨(dú)立地變化.具體的說(shuō),命令對(duì)象封裝了一個(gè)特定的請(qǐng)求和其對(duì)應(yīng)的操作,Invoker對(duì)象負(fù)責(zé)調(diào)用命令來(lái)執(zhí)行請(qǐng)求,而Receiver對(duì)象則負(fù)責(zé)實(shí)際執(zhí)行命令所代表的操作.

在Java中,可以通過(guò)定義一個(gè)接口來(lái)定義命令對(duì)象的基本行為,然后再定義具體的命令對(duì)象實(shí)現(xiàn)該接口.Invoker對(duì)象可以包含一個(gè)或多個(gè)命令對(duì)象,可以通過(guò)調(diào)用命令對(duì)象的execute()方法來(lái)執(zhí)行相應(yīng)的命令.而Receiver對(duì)象則負(fù)責(zé)實(shí)際執(zhí)行命令所代表的操作,其具體實(shí)現(xiàn)可以再命令對(duì)象的execute()方法中調(diào)用.

實(shí)現(xiàn)

命令對(duì)象接口

public interface Command {
    /**
     * 執(zhí)行
     */
    void execute();
    /**
     * 撤銷
     */
    void undo();
}

具體命令對(duì)象

public class ConcreteCommand1 implements Command {
    private Receiver receiver;
    private boolean isExecute;
    public ConcreteCommand1(Receiver receiver) {
        this.receiver = receiver;
    }
    /**
     * 執(zhí)行
     */
    @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;
    }
    /**
     * 執(zhí)行
     */
    @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() 被調(diào)用...");
    }
    public void action2() {
        System.out.println("Receiver.action2() 被調(diào)用...");
    }
    public void undoAction1(){
        System.out.println("Receiver.undoAction1() 被調(diào)用...");
    }
    public void undoAction2(){
        System.out.println("Receiver.undoAction2() 被調(diào)用...");
    }
}

命令請(qǐng)求者

public class Invoker {
    private List<Command> commandList = new ArrayList<>();
    /**
     * 添加命令
     *
     * @param command
     */
    public void addCommand(Command command) {
        commandList.add(command);
    }
    /**
     * 執(zhí)行命令
     */
    public void executeCommands() {
        commandList.forEach(Command::execute);
    }
    /**
     * 撤銷命令
     */
    public void undoCommands() {
        for (int i = commandList.size() - 1; i >= 0; i--) {
            commandList.get(i).undo();
        }
    }
}

測(cè)試

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();
    }
}

Java命令設(shè)計(jì)模式怎么實(shí)現(xiàn)

再示例代碼中,定義了兩個(gè)具體的命令對(duì)象實(shí)現(xiàn),分別是ConcreteCommand1和ConcreteCommand2,它們都實(shí)現(xiàn)了Command接口,并且支持撤銷操作.每個(gè)ConcreteCommand對(duì)象內(nèi)部維護(hù)了一個(gè)boolean類型的isExecute變量,表示該命令是否已經(jīng)執(zhí)行過(guò).如果execute()方法中,執(zhí)行具體的命令操作,并將isExecute設(shè)為true.再undo()方法中,如果該命令已經(jīng)執(zhí)行過(guò),則執(zhí)行與execute()方法相反的操作,并將isExecute設(shè)為false.Receiver類是命令接收者,它實(shí)際執(zhí)行命令所代表的操作.Invoker類中包含了一個(gè)Command對(duì)象列表,它通過(guò)addCommand()方法向其中添加具體的Command對(duì)象,executeCommand()用于執(zhí)行所有添加的Command對(duì)象,而undoCommands()方法則用于撤銷所有添加的Command對(duì)象,執(zhí)行與撤銷的順序正好相反.

感謝各位的閱讀,以上就是“Java命令設(shè)計(jì)模式怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java命令設(shè)計(jì)模式怎么實(shí)現(xiàn)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI