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

深入理解Java設(shè)計(jì)模式之命令模式

 更新時(shí)間:2021年11月07日 14:39:23   作者:一指流砂~  
這篇文章主要介紹了JAVA設(shè)計(jì)模式之命令模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解

一、什么是命令模式

命令模式是一個(gè)高內(nèi)聚的模式,其定義為:將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而讓你使用不同的請(qǐng)求把客戶(hù)端參數(shù)化,對(duì)請(qǐng) 求排隊(duì)或者記錄請(qǐng)求日志,可以提供命令的撤銷(xiāo)和恢復(fù)功能。

在該類(lèi)圖中,我們看到三個(gè)角色:

  • Receiver接受者角色:該角色就是干活的角色,命令傳遞到這里是應(yīng)該被執(zhí)行的
  • Command命令角色:需要執(zhí)行的所有命令都在這里聲明
  • Invoker調(diào)用者角色:接收到命令,并執(zhí)行命令

二、命令模式的使用場(chǎng)景

使用時(shí)機(jī):當(dāng)需要先將一個(gè)函數(shù)登記上,然后再以后調(diào)用此函數(shù)時(shí),就需要使用命令模式,其實(shí)這就是回調(diào)函數(shù)。

有時(shí)候需要向某些對(duì)象發(fā)送請(qǐng)求,但是并不知道請(qǐng)求的接收者是誰(shuí),也不知道被請(qǐng)求的操作是什么。此時(shí)希望用一種松耦合的方式來(lái)設(shè)計(jì)程序,使得請(qǐng)求發(fā)送者和請(qǐng)求接收者能夠消除彼此之間的耦合關(guān)系

例子:拿訂餐來(lái)說(shuō),客人需要向廚師發(fā)送請(qǐng)求,但是完全不知道這些廚師的名字和聯(lián)系方式,也不知道廚師炒菜的方式和步驟。 命令模式把客人訂餐的請(qǐng)求封裝成 command 對(duì)象,也就是訂餐中的訂單對(duì)象。這個(gè)對(duì)象可以在程序中被四處傳遞,就像訂單可以從服務(wù)員手中傳到廚師的手中。這樣一來(lái),客人不需要知道廚師的名字,從而解開(kāi)了請(qǐng)求調(diào)用者和請(qǐng)求接收者之間的耦合關(guān)系

三、命令模式的優(yōu)缺點(diǎn)

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

類(lèi)間解耦:調(diào)用者角色與接收者角色之間沒(méi)有任何依賴(lài)關(guān)系,調(diào)用者實(shí)現(xiàn)功能時(shí)只需調(diào)用Command 抽象類(lèi)的execute方法就可以,不需要了解到底是哪個(gè)接收者執(zhí)行??蓴U(kuò)展性:Command的子類(lèi)可以非常容易地?cái)U(kuò)展,而調(diào)用者Invoker和高層次的模塊Client不產(chǎn)生嚴(yán) 重的代碼耦合。命令模式結(jié)合其他模式會(huì)更優(yōu)秀:命令模式可以結(jié)合責(zé)任鏈模式,實(shí)現(xiàn)命令族解析任務(wù);結(jié)合模板方法模式,則可以減少 Command子類(lèi)的膨脹問(wèn)題。

缺點(diǎn):

命令模式也是有缺點(diǎn)的,請(qǐng)看Command的子類(lèi):如果有N個(gè)命令,問(wèn)題就出來(lái) 了,Command的子類(lèi)就可不是幾個(gè),而是N個(gè),這個(gè)類(lèi)膨脹得非常大,這個(gè)就需要讀者在項(xiàng) 目中慎重考慮使用。

四、命令模式的實(shí)現(xiàn)

Receiver類(lèi),知道如何實(shí)施與執(zhí)行一個(gè)與請(qǐng)求相關(guān)的操作,任何類(lèi)都可能作為一個(gè)接受者

class Receiver
{
    public void Action()
    {
        Console.WriteLine("執(zhí)行請(qǐng)求!");
    }
}

Command類(lèi),用來(lái)聲明執(zhí)行操作的接口

abstract class Command
{
    protected Receiver receiver;
    public Command(Receiver receiver)
    {
        this.receiver = receiver;
    }
    abstract public void Execute();
}

ConcreteCommand類(lèi),將一個(gè)接受者對(duì)象綁定于一個(gè)動(dòng)作,調(diào)用接受者相應(yīng)的操作,以實(shí)現(xiàn)Execute。

class ConcreteCommand : Command
{
    public ConcreteCommand(Receiver receiver) : base(receiver)
    {
    }
     public override void Execute()
    {
        receiver.Action();
    }
}

Invoker類(lèi),要求該命令執(zhí)行這個(gè)請(qǐng)求

class Invoker
{
    private Command command;
    public void SetCommand(Command command)
    {
        this.command = command;
    }
    public void ExecuteCommand()
    {
        command.Execute();
    }
}

客戶(hù)端代碼

static void Main(string[] args)
{
    Receiver r = new Receiver();
    Command c = new ConcreteCommand(r);
    Invoker i = new Invoker();
     i.SetCommand(c);
    i.ExecuteCommand();
     Console.Read();
}

五、總結(jié)

命令模式的意圖是將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而使您可以用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化。

命令模式主要解決的問(wèn)題是在軟件系統(tǒng)中,行為請(qǐng)求者與行為實(shí)現(xiàn)者通常是一種緊耦合的關(guān)系,但某些場(chǎng)合,比如需要對(duì)行為進(jìn)行記錄、撤銷(xiāo)或重做、事務(wù)等處理時(shí),這種無(wú)法抵御變化的緊耦合的設(shè)計(jì)就不太合適。

在某些場(chǎng)合,比如要對(duì)行為進(jìn)行"記錄、撤銷(xiāo)/重做、事務(wù)"等處理,這種無(wú)法抵御變化的緊耦合是不合適的。在這種情況下,如何將"行為請(qǐng)求者"與"行為實(shí)現(xiàn)者"解耦?將一組行為抽象為對(duì)象,可以實(shí)現(xiàn)二者之間的松耦合,這是命令模式的使用場(chǎng)景。

系統(tǒng)需要支持命令的撤銷(xiāo)(Undo)操作和恢復(fù)(Redo)操作,也可以考慮使用命令模式

命令模式的實(shí)現(xiàn)過(guò)程通過(guò)調(diào)用者調(diào)用接受者執(zhí)行命令,順序:調(diào)用者→接受者→命令。

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java List Object[]轉(zhuǎn)換成List T的實(shí)例

    Java List Object[]轉(zhuǎn)換成List T的實(shí)例

    這篇文章主要介紹了Java List Object[]轉(zhuǎn)換成List T的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • java對(duì)xml節(jié)點(diǎn)屬性的增刪改查實(shí)現(xiàn)方法

    java對(duì)xml節(jié)點(diǎn)屬性的增刪改查實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇java對(duì)xml節(jié)點(diǎn)屬性的增刪改查實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • 使用stream的Collectors.toMap()方法常見(jiàn)的問(wèn)題及解決

    使用stream的Collectors.toMap()方法常見(jiàn)的問(wèn)題及解決

    這篇文章主要介紹了使用stream的Collectors.toMap()方法常見(jiàn)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java的ThreadPoolExecutor業(yè)務(wù)線(xiàn)程池詳細(xì)解析

    Java的ThreadPoolExecutor業(yè)務(wù)線(xiàn)程池詳細(xì)解析

    這篇文章主要介紹了Java線(xiàn)程池ThreadPoolExecutor詳細(xì)解析,任務(wù)剛開(kāi)始進(jìn)來(lái)的時(shí)候就創(chuàng)建核心線(xiàn)程,核心線(xiàn)程滿(mǎn)了會(huì)把任務(wù)放到阻塞隊(duì)列,阻塞隊(duì)列滿(mǎn)了之后才會(huì)創(chuàng)建空閑線(xiàn)程,達(dá)到最大線(xiàn)程數(shù)之后,再有任務(wù)進(jìn)來(lái),就只能執(zhí)行拒絕策略了,需要的朋友可以參考下
    2024-01-01
  • 在java中獲取List集合中最大的日期時(shí)間操作

    在java中獲取List集合中最大的日期時(shí)間操作

    這篇文章主要介紹了在java中獲取List集合中最大的日期時(shí)間操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • 基于SpringBoot2.0默認(rèn)使用Redis連接池的配置操作

    基于SpringBoot2.0默認(rèn)使用Redis連接池的配置操作

    這篇文章主要介紹了基于SpringBoot2.0默認(rèn)使用Redis連接池的配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Java經(jīng)典面試題之NIO多路復(fù)用

    Java經(jīng)典面試題之NIO多路復(fù)用

    JAVA?NIO?的多路復(fù)用是面試中經(jīng)常被問(wèn)的問(wèn)題,今天我們徹底搞明白究竟是怎么回事,文中的示例代碼講解詳細(xì),希望對(duì)大家學(xué)習(xí)Java有所幫助
    2023-06-06
  • SpringBoot項(xiàng)目打包發(fā)布到外部tomcat(出現(xiàn)各種異常的解決)

    SpringBoot項(xiàng)目打包發(fā)布到外部tomcat(出現(xiàn)各種異常的解決)

    這篇文章主要介紹了SpringBoot項(xiàng)目打包發(fā)布到外部tomcat(出現(xiàn)各種異常的解決),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 項(xiàng)目打包成jar后包無(wú)法讀取src/main/resources下文件的解決

    項(xiàng)目打包成jar后包無(wú)法讀取src/main/resources下文件的解決

    本文主要介紹了項(xiàng)目打包成jar后包無(wú)法讀取src/main/resources下文件的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Intellij IDEA 配置Subversion插件實(shí)現(xiàn)步驟詳解

    Intellij IDEA 配置Subversion插件實(shí)現(xiàn)步驟詳解

    這篇文章主要介紹了Intellij IDEA 配置Subversion插件實(shí)現(xiàn)步驟詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評(píng)論