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

詳解Java設(shè)計模式——命令模式

 更新時間:2019年04月03日 08:35:39   作者:No_Game_No_Life_  
這篇文章主要介紹了Java設(shè)計模式——命令模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

命令模式

命令模式很好理解,舉個例子,司令員下令讓士兵去干件事情,從整個事情的角度來考慮,司令員的作用是,發(fā)出口令,口令經(jīng)過傳遞,傳到了士兵耳朵里,士兵去執(zhí)行。這個過程好在,三者相互解耦,任何一方都不用去依賴其他人,只需要做好自己的事兒就行,司令員要的是結(jié)果,不會去關(guān)注到底士兵是怎么實(shí)現(xiàn)的。我們看看關(guān)系圖:

Invoker是調(diào)用者(司令員),Receiver是被調(diào)用者(士兵),MyCommand是命令,實(shí)現(xiàn)了Command接口,持有接收對象,看實(shí)現(xiàn)代碼:

public interface Command { 
  public void exe(); 
} 
public class MyCommand implements Command { 
 
  private Receiver receiver; 
   
  public MyCommand(Receiver receiver) { 
    this.receiver = receiver; 
  } 
 
  @Override 
  public void exe() { 
    receiver.action(); 
  } 
} 
public class Receiver { 
  public void action(){ 
    System.out.println("command received!"); 
  } 
} 
public class Invoker { 
   
  private Command command; 
   
  public Invoker(Command command) { 
    this.command = command; 
  } 
 
  public void action(){ 
    command.exe(); 
  } 
} 
public class Test { 
 
  public static void main(String[] args) { 
    Receiver receiver = new Receiver(); 
    Command cmd = new MyCommand(receiver); 
    Invoker invoker = new Invoker(cmd); 
    invoker.action(); 
  } 
} 

這個很哈理解,命令模式的目的就是達(dá)到命令的發(fā)出者和執(zhí)行者之間解耦,實(shí)現(xiàn)請求和執(zhí)行分開,熟悉Struts的同學(xué)應(yīng)該知道,Struts其實(shí)就是一種將請求和呈現(xiàn)分離的技術(shù),其中必然涉及命令模式的思想!

介紹

意圖:將一個請求封裝成一個對象,從而使您可以用不同的請求對客戶進(jìn)行參數(shù)化。

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

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

如何解決:通過調(diào)用者調(diào)用接受者執(zhí)行命令,順序:調(diào)用者→接受者→命令。

關(guān)鍵代碼:定義三個角色:1、received 真正的命令執(zhí)行對象 2、Command 3、invoker 使用命令對象的入口

應(yīng)用實(shí)例:struts 1 中的 action 核心控制器 ActionServlet 只有一個,相當(dāng)于 Invoker,而模型層的類會隨著不同的應(yīng)用有不同的模型類,相當(dāng)于具體的 Command。

優(yōu)點(diǎn): 1、降低了系統(tǒng)耦合度。 2、新的命令可以很容易添加到系統(tǒng)中去。

缺點(diǎn):使用命令模式可能會導(dǎo)致某些系統(tǒng)有過多的具體命令類。

使用場景:認(rèn)為是命令的地方都可以使用命令模式,比如: 1、GUI 中每一個按鈕都是一條命令。 2、模擬 CMD。

注意事項(xiàng):系統(tǒng)需要支持命令的撤銷(Undo)操作和恢復(fù)(Redo)操作,也可以考慮使用命令模式,見命令模式的擴(kuò)展。

以上所述是小編給大家介紹的Java設(shè)計模式——命令模式詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java SPI機(jī)制詳細(xì)介紹

    Java SPI機(jī)制詳細(xì)介紹

    大家好,本篇文章主要講的是Java SPI機(jī)制詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • MyBatis高級映射ResultMap解決屬性問題

    MyBatis高級映射ResultMap解決屬性問題

    對于數(shù)據(jù)庫中對表的增刪改查操作,我們知道增刪改都涉及的是單表,而只有查詢操作既可以設(shè)計到單表操作又可以涉及到多表操作,所以對于輸入映射parameterType而言是沒有所謂的高級映射的,也就是說高級映射只針對于輸出映射
    2023-02-02
  • Java異常分類以及幾種處理機(jī)制分析講解

    Java異常分類以及幾種處理機(jī)制分析講解

    在Java的廣闊宇宙中,有一群特殊的“超級英雄”,它們在代碼世界中穿梭,守護(hù)著程序的正常運(yùn)行——它們就是“異常”,這些英雄們,各司其職,保護(hù)著程序免受錯誤的侵?jǐn)_,今天,我們將深入這個神秘的世界,全面解析異常的分類,掌握異常的處理機(jī)制
    2024-07-07
  • Java?報錯?java.util.ConcurrentModificationException:?null?的原因及解決方案

    Java?報錯?java.util.ConcurrentModificationException:?null?

    這篇文章主要介紹了Java?報錯?java.util.ConcurrentModificationException:?null?的原因和解決方案,這個異常通常在多線程環(huán)境下出現(xiàn),意味著在迭代過程中,集合或者映射的結(jié)構(gòu)發(fā)生了變化,本文分享完美解決方案,需要的朋友可以參考下
    2023-07-07
  • 如何通過properties文件配置web.xml中的參數(shù)

    如何通過properties文件配置web.xml中的參數(shù)

    這篇文章主要介紹了如何通過properties文件配置web.xml中的參數(shù)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解SpringSecurity處理會話管理和注銷功能

    詳解SpringSecurity處理會話管理和注銷功能

    本文介紹了詳解SpringSecurity處理會話管理和注銷功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Java中的線程私有變量ThreadLocal詳解

    Java中的線程私有變量ThreadLocal詳解

    這篇文章主要介紹了Java中的線程私有變量ThreadLocal詳解,ThreadLoalMap是ThreadLocal中的一個靜態(tài)內(nèi)部類,類似HashMap的數(shù)據(jù)結(jié)構(gòu),但并沒有實(shí)現(xiàn)Map接口,需要的朋友可以參考下
    2023-08-08
  • 詳解IDEA2020新建spring項(xiàng)目和c3p0連接池的創(chuàng)建和使用

    詳解IDEA2020新建spring項(xiàng)目和c3p0連接池的創(chuàng)建和使用

    C3P0是一個開源的JDBC連接池,它實(shí)現(xiàn)了數(shù)據(jù)源和JNDI綁定,本文就使用Spring實(shí)現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • mybatis接口綁定失效的解決

    mybatis接口綁定失效的解決

    這篇文章主要介紹了mybatis接口綁定失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java數(shù)據(jù)結(jié)構(gòu)之選擇排序算法的實(shí)現(xiàn)與優(yōu)化

    Java數(shù)據(jù)結(jié)構(gòu)之選擇排序算法的實(shí)現(xiàn)與優(yōu)化

    選擇排序:(Selection?sort)是一種簡單直觀的排序算法,也是一種不穩(wěn)定的排序方法。本文主要為大家介紹一下選擇排序的實(shí)現(xiàn)與優(yōu)化,希望對大家有所幫助
    2023-01-01

最新評論

鲜城| 黔南| 枣庄市| 灌南县| 皮山县| 德江县| 滦平县| 盘锦市| 德令哈市| 德钦县| 合肥市| 阳西县| 吐鲁番市| 肃北| 宁阳县| 章丘市| 莱阳市| 阿拉善盟| 临猗县| 布尔津县| 石渠县| 萝北县| 会同县| 云龙县| 濮阳县| 阜新市| 定兴县| 新余市| 安溪县| 治县。| 松溪县| 鸡泽县| 东乌| 松桃| 内丘县| 长岛县| 城固县| 吉安县| 松原市| 巴彦县| 嫩江县|