亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java命令設(shè)計(jì)模式優(yōu)雅解耦命令和執(zhí)行提高代碼可維護(hù)性

 更新時(shí)間:2023年04月26日 08:31:00   作者:.番茄炒蛋  
本文介紹了Java命令設(shè)計(jì)模式,它將命令請(qǐng)求封裝成對(duì)象,以達(dá)到解耦命令請(qǐng)求和執(zhí)行者的目的,從而提高代碼可維護(hù)性。本文詳細(xì)闡述了該模式的設(shè)計(jì)原則、實(shí)現(xiàn)方法和優(yōu)缺點(diǎn),并提供了實(shí)際應(yīng)用場(chǎng)景和代碼示例,幫助讀者深入理解和應(yīng)用該模式

介紹

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ú)立地變化.具體的說,命令對(duì)象封裝了一個(gè)特定的請(qǐng)求和其對(duì)應(yīng)的操作,Invoker對(duì)象負(fù)責(zé)調(diào)用命令來執(zhí)行請(qǐng)求,而Receiver對(duì)象則負(fù)責(zé)實(shí)際執(zhí)行命令所代表的操作.

在Java中,可以通過定義一個(gè)接口來定義命令對(duì)象的基本行為,然后再定義具體的命令對(duì)象實(shí)現(xiàn)該接口.Invoker對(duì)象可以包含一個(gè)或多個(gè)命令對(duì)象,可以通過調(diào)用命令對(duì)象的execute()方法來執(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();
    }
}

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

總結(jié)

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

  • 解耦合,命令模式可以將命令請(qǐng)求者和命令接收者之間解耦合,使得它們之間不直接產(chǎn)生相互作用,從而提高系統(tǒng)的靈活性和可擴(kuò)展性
  • 擴(kuò)展性,由于命令模式將請(qǐng)求封裝成對(duì)象,因此可以方便地新增或修改命令,而不影響其他對(duì)象的運(yùn)行.同時(shí),也可以方便地新增或修改命令接收者,從而實(shí)現(xiàn)系統(tǒng)功能的靈活變化.
  • 撤銷操作,命令模式可以支持撤銷操作,使得系統(tǒng)具有回滾功能,增強(qiáng)了系統(tǒng)的容錯(cuò)性.

缺點(diǎn)

  • 系統(tǒng)復(fù)雜性,使用命令模式需要增加額外的類和接口,從而增加了系統(tǒng)的復(fù)雜性
  • 性能損失.由于需要將請(qǐng)求封裝成對(duì)象,因此可能會(huì)導(dǎo)致系統(tǒng)性能的降低,特別是再處理大量請(qǐng)求時(shí)

應(yīng)用場(chǎng)景

  • 撤銷操作,如果系統(tǒng)需要支持撤銷操作,那么命令模式是一個(gè)非常好的選擇.例如:文本編輯器中的"撤銷"和"重做"操作.
  • 日志記錄,命令模式可以用來記錄請(qǐng)求日志,從而實(shí)現(xiàn)系統(tǒng)的日志功能.例如:使用命令模式記錄用戶的操作記錄,實(shí)現(xiàn)系統(tǒng)的審計(jì)功能.
  • 隊(duì)列請(qǐng)求.如果需要將請(qǐng)求排隊(duì),可以使用命令模式來管理請(qǐng)求隊(duì)列.例如:使用命令模式管理操作系統(tǒng)的I/O請(qǐng)求隊(duì)列.

到此這篇關(guān)于Java命令設(shè)計(jì)模式優(yōu)雅解耦命令和執(zhí)行提高代碼可維護(hù)性的文章就介紹到這了,更多相關(guān)Java命令設(shè)計(jì)模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java fastjson解析json字符串實(shí)現(xiàn)過程解析

    Java fastjson解析json字符串實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Java fastjson解析json字符串實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java web實(shí)現(xiàn)分頁(yè)查詢實(shí)例方法

    java web實(shí)現(xiàn)分頁(yè)查詢實(shí)例方法

    在本篇文章里我們給大家分享了java web實(shí)現(xiàn)分頁(yè)查詢的詳細(xì)方法知識(shí)點(diǎn),有需要的朋友們參考學(xué)習(xí)下。
    2018-10-10
  • IDEA使用maven創(chuàng)建hibernate項(xiàng)目的實(shí)現(xiàn)步驟(圖文)

    IDEA使用maven創(chuàng)建hibernate項(xiàng)目的實(shí)現(xiàn)步驟(圖文)

    本文主要介紹了IDEA使用maven創(chuàng)建hibernate項(xiàng)目的實(shí)現(xiàn)步驟,包括創(chuàng)建Maven項(xiàng)目,配置Hibernate,以及創(chuàng)建實(shí)體類映射到數(shù)據(jù)庫(kù)等步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 使用java springboot設(shè)計(jì)實(shí)現(xiàn)的圖書管理系統(tǒng)(建議收藏)

    使用java springboot設(shè)計(jì)實(shí)現(xiàn)的圖書管理系統(tǒng)(建議收藏)

    這篇文章主要介紹了使用java springboot設(shè)計(jì)實(shí)現(xiàn)的圖書管理系統(tǒng),包含了整個(gè)的開發(fā)過程,以及過程中遇到的問題和解決方法,對(duì)大家的學(xué)習(xí)和工作具有借鑒意義,建議收藏一下
    2021-08-08
  • Springboot實(shí)現(xiàn)頁(yè)面間跳轉(zhuǎn)功能

    Springboot實(shí)現(xiàn)頁(yè)面間跳轉(zhuǎn)功能

    這篇文章主要介紹了Springboot實(shí)現(xiàn)頁(yè)面間跳轉(zhuǎn)功能,本文給大家分享兩種方式,方法一和方法二是不沖突的,但是通常情況下如果用方法二addViewControllers,需要把方法一所寫的Controller類給注釋掉,需要的朋友可以參考下
    2023-10-10
  • shiro之INI配置詳解

    shiro之INI配置詳解

    這篇文章主要為大家詳細(xì)介紹了shiro之INI配置的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java異常跟蹤棧定義與用法示例

    Java異常跟蹤棧定義與用法示例

    這篇文章主要介紹了Java異常跟蹤棧定義與用法,結(jié)合具體實(shí)例形式分析了異常處理?xiàng)5母拍?、原理及相關(guān)使用技巧,需要的朋友可以參考下
    2018-05-05
  • idea遠(yuǎn)程Debug部署在服務(wù)器上的服務(wù)

    idea遠(yuǎn)程Debug部署在服務(wù)器上的服務(wù)

    在開發(fā)的時(shí)候我們通常在本地代碼上debug程序,但是服務(wù)部署到了開發(fā)環(huán)境服務(wù)器上,如何遠(yuǎn)程調(diào)試,本文主要介紹了idea遠(yuǎn)程Debug部署在服務(wù)器上的服務(wù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • IDEA新建springboot項(xiàng)目時(shí)未生成pom.xml文件的解決操作

    IDEA新建springboot項(xiàng)目時(shí)未生成pom.xml文件的解決操作

    這篇文章主要給大家介紹了關(guān)于IDEA新建springboot項(xiàng)目時(shí)未生成pom.xml文件的解決操作方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Java實(shí)現(xiàn)InputStream的任意拷貝方式

    Java實(shí)現(xiàn)InputStream的任意拷貝方式

    這篇文章主要介紹了Java實(shí)現(xiàn)InputStream的任意拷貝方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論