Java設(shè)計(jì)模式----命令模式

介紹

將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使我們可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及支持可撤銷的操作。也稱之為:動(dòng)作(Action)模式、事物(transaction)模式

結(jié)構(gòu)

  • Command抽象命令類
  • ConcreteCommand具體命令類
  • Invoker調(diào)用者/請(qǐng)求者
    請(qǐng)求的發(fā)送者,它通過命令對(duì)象來執(zhí)行請(qǐng)求。一個(gè)調(diào)用者并不需要在設(shè)計(jì)時(shí)確定其接收者,因此它只與抽象命令類之間存在關(guān)聯(lián)。在程序運(yùn)行時(shí),將調(diào)用命令對(duì)象的execute(),間接調(diào)用接收者的相關(guān)操作。
  • Receiver接收者
    接收者執(zhí)行與請(qǐng)求相關(guān)的操作,具體實(shí)現(xiàn)對(duì)請(qǐng)求的業(yè)務(wù)處理。
    未抽象前,實(shí)際執(zhí)行操作內(nèi)容的對(duì)象。
  • Client客戶類
    在客戶類中需要?jiǎng)?chuàng)建調(diào)用者對(duì)象、具體命令類對(duì)象,在創(chuàng)建具體命令對(duì)象時(shí)指定對(duì)應(yīng)的接收者。發(fā)送和接收者之間沒有直接關(guān)系,都通過命令對(duì)象間接調(diào)用。


    命令模式
package command;

public class Receiver {
    public void action(){
        System.out.println("Receiver.action()");
    }
}
package command;

public interface Command {
    // 實(shí)際項(xiàng)目中,可以根據(jù)需求設(shè)計(jì)多個(gè)不同的方法
    void execute();
}


class ConcreteCommand implements Command{
    private Receiver receiver;      // 命令正真的執(zhí)行者

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    public void execute() {
        // 可以在命令正真執(zhí)行前后,執(zhí)行相關(guān)處理
        receiver.action();
    }
}
package command;

public class Invoker {
    private Command command;    //也可以通過容器List<Command>容納多個(gè)命令對(duì)象,進(jìn)行批處理

    public Invoker(Command command) {
        this.command = command;
    }

    // 業(yè)務(wù)方法,用于調(diào)用命令類的方法
    public void call(){
        command.execute();
    }
}
package command;

public class Client {
    public static void main(String[] args) {
        Command command = new ConcreteCommand(new Receiver());

        Invoker invoker = new Invoker(command);

        invoker.call();
    }
}

開發(fā)中常見的場景

  • Struts2中,action的整個(gè)調(diào)用過程中就有命令模式。
  • 數(shù)據(jù)庫事物機(jī)制的底層實(shí)現(xiàn)
  • 命令的撤銷和恢復(fù)

優(yōu)點(diǎn)

  • 它能比較容易地設(shè)計(jì)一個(gè)命令隊(duì)列;
  • 在需要的情況下,可以較容易地將命令記入日志;
  • 允許接收請(qǐng)求的一方?jīng)Q定是否要否決請(qǐng)求;
  • 可以容易地實(shí)現(xiàn)對(duì)請(qǐng)求的撤銷和重做;
  • 由于加進(jìn)新的具體命令類不影響其他類,因此增加新的具體命令類很容易;
  • 命令模式吧請(qǐng)求一個(gè)操作的對(duì)象與知道怎么執(zhí)行一個(gè)操作的對(duì)象分割開;
    敏捷開發(fā)原則告訴我們,不要為代碼添加基于猜測的、實(shí)際不需要的功能。如果不清楚一個(gè)系統(tǒng)是否需要命令模式,一般就不要著急去實(shí)現(xiàn)它,事實(shí)上,在需要的時(shí)候通過重構(gòu)實(shí)現(xiàn)這個(gè)模式并不困難,只有在真正需要如撤銷/恢復(fù)操作等功能時(shí),把原來的代碼重構(gòu)為命令模式才有意義。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容