最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計模式之命令模式詳細(xì)解析

 更新時間:2024年01月24日 10:37:21   作者:愛上口袋的天空  
這篇文章主要介紹了Java設(shè)計模式之命令模式詳細(xì)解析,命令模式將請求封裝成對象,以便使用不同的請求、隊列或者日志來參數(shù)化其他對象,同時也支持可撤銷的操作,需要的朋友可以參考下

1、簡介

1.1、定義

命令模式:將請求封裝成對象,以便使用不同的請求、隊列或者日志來參數(shù)化其他對象。(同時也支持可撤銷的操作)

1.2、解決的問題

通常在系統(tǒng)設(shè)計中,行為請求者和行為實現(xiàn)者是緊耦合的關(guān)系。

而在一些特定的場景下,比如:需要對行為進(jìn)行記錄、撤銷或重做、事務(wù)等處理時,需要將行為請求者和行為實現(xiàn)者分離開來,這時就可以用到命令模式。

1.3、模式結(jié)構(gòu)

  • Command:定義命令的接口,聲明執(zhí)行的方法
  • ConcreteCommand:命令接口實現(xiàn)對象,是“命令接口”的實現(xiàn);通常會持有接收者,并調(diào)用接收者的功能來完成命令要執(zhí)行的操作
  • Receiver:接收者,真正執(zhí)行命令的對象。任何類都可能成為一個接收者,只要它能夠?qū)崿F(xiàn)命令要求實現(xiàn)的相應(yīng)功能
  • Invoker:要求命令對象執(zhí)行請求,通常會持有命令對象,可以持有很多的命令對象。這個是客戶端真正觸發(fā)命令并要求命令執(zhí)行相應(yīng)操作的地方,也就是說相當(dāng)于使用命令對象的入口
  • Client:創(chuàng)建具體的命令對象,并且設(shè)置命令對象的接收者。注意這個不是我們常規(guī)意義上的客戶端,而是在組裝命令對象和接收者,或許,把這個Client稱為裝配者會更好理解,因為真正使用命令的客戶端是從Invoker來觸發(fā)執(zhí)行

1.4、結(jié)構(gòu)類圖

在這里插入圖片描述

1.5、運(yùn)作流程

  1. Client創(chuàng)建一個ConcreteCommand對象并指定他的Receiver對象
  2. 某個Invoker對象存儲該ConcreteCommand對象
  3. 該Invoker通過調(diào)用Command對象的Execute操作來提交一個請求。若該命令是可撤銷的,ConcreteCommand就在執(zhí)行Execute操作之前存儲當(dāng)前狀態(tài)以用于取消該命令
  4. ConcreteCommand對象對調(diào)用它的Receiver的一些操作以執(zhí)行該請求

2、示例Demo

2.1、Command

package com.jbp.designpattern.command;
/**
 * @ClassName: Order
 * @description: 命令接口 --- Command
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:15
 * @Version: 1.0
 **/
public interface Order {
    void execute();
}
 

2.2、ConcreteCommand

package com.jbp.designpattern.command;
/**
 * @ClassName: BuyStock
 * @description: 加庫存 --- ConcreteCommmand
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:39
 * @Version: 1.0
 **/
public class BuyStock implements Order{
    private Stock stock;
    public BuyStock(Stock stock) {
        this.stock = stock;
    }
    @Override
    public void execute() {
        stock.buy();
    }
}
 
package com.jbp.designpattern.command;
/**
 * @ClassName: SellStock
 * @description: 清庫存 --- ConcreteCommmand
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:41
 * @Version: 1.0
 **/
public class SellStock implements Order{
    private Stock stock;
    public SellStock(Stock stock) {
        this.stock = stock;
    }
    @Override
    public void execute() {
        stock.sell();
    }
}
 

2.3、Receiver

package com.jbp.designpattern.command;
/**
 * @ClassName: Stock
 * @description: 請求類  --- Receiver
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:16
 * @Version: 1.0
 **/
public class Stock {
    private String name = "庫存一號";
    // 數(shù)量
    private int quantity = 10;
    public void buy(){
        System.out.println("名字:" + name + ",數(shù)量:" + quantity);
    }
    public void sell(){
        System.out.println("名字:" + name + ",數(shù)量:" + quantity);
    }
}
 

2.4、Invoker

package com.jbp.designpattern.command;
import java.util.ArrayList;
import java.util.List;
/**
 * @ClassName: Broker
 * @description: 命令調(diào)用類  --- invoker
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:43
 * @Version: 1.0
 **/
public class Broker {
    private List<Order> orderList = new ArrayList<>();
    // 加庫存
    public void takeOrder(Order order){
        orderList.add(order);
    }
    // 清庫存
    public void placeOrders(){
        for (Order order : orderList) {
            order.execute();
        }
        orderList.clear();
    }
}
 

2.5、Client

package com.jbp.designpattern.command;
/**
 * @ClassName: test
 * @description: 測試 --- Client
 * @author: JiangBeiPing
 * @create: 2021-07-23 11:50
 * @Version: 1.0
 **/
public class test {
    public static void main(String[] args) {
        Stock stock = new Stock();
        BuyStock buyStock = new BuyStock(stock);
        SellStock sellStock = new SellStock(stock);
        Broker broker = new Broker();
        broker.takeOrder(buyStock);
        broker.takeOrder(sellStock);
        broker.placeOrders();
    }
}
 

3、優(yōu)缺點

優(yōu)點

類間解耦:調(diào)用者角色與接收者角色之間沒有任何依賴關(guān)系可擴(kuò)展性:Command的子類具備高擴(kuò)展性可以比較容易地設(shè)計一個組合命令

缺點

Command的子類過多(如果有過多的命令,就會有過多的Command子類)

使用場景

隊列請求日志請求系統(tǒng)需要將一組操作組合在一起,即支持宏命令

到此這篇關(guān)于Java設(shè)計模式之命令模式詳細(xì)解析的文章就介紹到這了,更多相關(guān)Java命令模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決spring-boot-maven-plugin報紅的問題

    解決spring-boot-maven-plugin報紅的問題

    這篇文章主要給大家介紹一下如何解決spring-boot-maven-plugin報紅的問題,文中通過圖文講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2023-08-08
  • Java深入淺出理解快速排序以及優(yōu)化方式

    Java深入淺出理解快速排序以及優(yōu)化方式

    快速排序由于排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經(jīng)常被采用,再加上快速排序思想----分治法也確實實用,因此很多軟件公司的筆試面試,包括像騰訊,微軟等知名IT公司都喜歡考這個,還有大大小的程序方面的考試如軟考,考研中也常常出現(xiàn)快速排序的身影
    2021-11-11
  • Springboot 自定義線程池的參數(shù)配置最優(yōu)小結(jié)

    Springboot 自定義線程池的參數(shù)配置最優(yōu)小結(jié)

    在SpringBoot中配置自定義線程池時,參數(shù)的設(shè)置需要根據(jù)具體的應(yīng)用場景、系統(tǒng)資源和業(yè)務(wù)需求來調(diào)整,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2025-10-10
  • Java實現(xiàn)非阻塞式服務(wù)器的示例代碼

    Java實現(xiàn)非阻塞式服務(wù)器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實現(xiàn)一個簡單的非阻塞式服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,需要的可以參考一下
    2023-05-05
  • Java 格式化輸出String.format() 示例解析

    Java 格式化輸出String.format() 示例解析

    String.format() 是Java中非常強(qiáng)大的工具,掌握它可以讓你在處理字符串輸出時事半功倍,本文給大家介紹Java格式化輸出String.format()的相關(guān)操作,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • java的io操作(將字符串寫入到txt文件中)

    java的io操作(將字符串寫入到txt文件中)

    這篇文章主要介紹了java的io操作示例,將字符串寫入到txt文件中,需要的朋友可以參考下
    2014-04-04
  • Java調(diào)用Deepseek實現(xiàn)項目代碼審查

    Java調(diào)用Deepseek實現(xiàn)項目代碼審查

    這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用Deepseek實現(xiàn)項目代碼審查功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • 詳解Maven環(huán)境的搭建與idea配置

    詳解Maven環(huán)境的搭建與idea配置

    本篇文章主要介紹了詳解Maven環(huán)境的搭建與idea配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 開發(fā)工具EesyCode使用方法解析

    開發(fā)工具EesyCode使用方法解析

    這篇文章主要介紹了開發(fā)工具EesyCode使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 手寫mybatis完整sql插件問題及實現(xiàn)思路

    手寫mybatis完整sql插件問題及實現(xiàn)思路

    大家在使用mybatis的過程中,mysql日志功能一般不會直接放到數(shù)據(jù)庫中執(zhí)行的,今天小編重點給大家分享手寫mybatis完整sql插件問題及實現(xiàn)思路,對mybatis完整sql插件相關(guān)知識感興趣的朋友一起看看吧
    2021-05-05

最新評論

荔波县| 绥化市| 垫江县| 来安县| 马关县| 馆陶县| 建昌县| 广东省| 盐亭县| 汕头市| 宁德市| 马尔康县| 南华县| 盐边县| 拉孜县| 中宁县| 城口县| 大同县| 敖汉旗| 常德市| 济源市| 福州市| 元朗区| 昌黎县| 太仓市| 莲花县| 麟游县| 安宁市| 开江县| 湘阴县| 双辽市| 通山县| 宣恩县| 景洪市| 苏尼特右旗| 平乡县| 上蔡县| 苏尼特右旗| 邓州市| 方城县| 凤翔县|