設計模式系列漫談之七 命令模式

2022-02-28 07:47:42 字數 2248 閱讀 1240

小雪的故事暫停,欲知後事如何,請等下回再編!現在改編另乙個故事。

故事

小時候,我夢想自己成為一名真正的軍人,對軍營生活充滿著嚮往.,軍人的豪氣,軍人的英姿總給人無限遐想。閒暇之餘,我喜歡看看軍事題材的電視劇集,包括《和平年代》、《歷史的天空》、《沙場點兵》、《中國近衛軍》、《垂直打擊》、《石破天驚》、《鐵色高原》。今年一部電視劇集《士兵突擊》再次讓農村出身的傻根成為2023年最耀眼的明星。

我想,大多數讀過大學的人都經歷過一段艱苦的軍訓生活(其實根本不算苦)。雖然這種軍訓每天也只是練練軍姿,走走正步而已,但是還是覺得有點新鮮感。當時,在所有的教官中,我們的教官是最帥氣的。大家還開玩笑說,他必將會成為我們學校所有女生的夢中情人。另外,他的嗓門特別大,立正! 稍息!向左轉! 向右轉!那聲音簡直是震耳欲聾!

軍人以服從命令為天職。立正! 稍息!向左轉! 向右轉!

命令模式(command)的解決方案

gof在《設計模式》中對命令模式描述:將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行引數化。命令模式中需要定義的角色:命令接收者(receiver)、命令抽象類(command)、具體命令物件(lzcommand/sxcommand/xzzcommand/xyzcommand)、命令執行者(invoker)。

命令接收者物件如下:

namespace

xxpublic

void

lz()

public

void

sx()

public

void

xzz()

public

void

xyz()}}

命令抽象類如下:

namespace

xxpublic

abstract

void

execute();}}

命令具體物件如下:

namespace

xxpublic

override

void

execute()

}public

class

sxcommand:command

public

override

void

execute()

}public

class

xzzcommand:icommand

public

override

void

execute()

}public

class

xzzcommand:icommand

public

override

void

execute()}}

命令執行者物件如下:

namespace

xxpublic

void

lz()

public

void

sx()

public

void

xzz()

public

void

xyz()}}

接下來,我們通過客戶端進行呼叫。假如我們建立乙個窗體,窗體上放置四個按鈕,如下圖:

呼叫**如下:

public

partial

class

form1 : form

private

void

btnlz_click(

object

sender, eventargs e)

private

void

btnsx_click(

object

sender, eventargs e)

private

void

btnxzz_click(

object

sender, eventargs e)

private

void

btnxyz_click(

object

sender, eventargs e)

}最後乙個問題,如果我要增加乙個命令按鈕「向後轉」,怎麼辦呢?我們可以認為,向左轉 + 向左轉=向後轉,所以實現如下:

invoker.xzz();

invoker.xzz();

當然這樣的理解有些牽強。這裡,我只想說明乙個道理,那就是:封裝的物件的顆粒度盡量最小化。

設計模式系列(行為型模式)之七 命令模式

命令 command 模式的定義如下 將乙個請求封裝為乙個物件,使發出請求的責任和執行請求的責任分割開。這樣兩者之間通過命令物件進行溝通,這樣方便將命令物件進行儲存 傳遞 呼叫 增加與管理。優點 降低系統的耦合度。命令模式能將呼叫操作的物件與實現該操作的物件解耦。增加或刪除命令非常方便。採用命令模式...

設計模式系列漫談之八 復合模式

故事 10月20日,我們公司一行幾人參加紹興客戶的專案招標。出乎意料的是,就在當天,這家單位同時舉行三個專案的招標 真牛 所以十幾家單位都在等候。我們上午8 30就到了現場,而我們投標的專案去排在下午進行。傻坐了一會,我們提議到魯迅故居去看看。其實幾次去紹興出差都匆匆忙忙的,今天終於如願以償。近來確...

設計模式系列漫談之十二 職責鏈模式

從牙膏廣告說起 在午茶小憩間,以 成語接龍 形式,通過帥哥美女之口巧妙地把牙齒常見的症狀表達出來,從而突出雲南白藥牙膏的獨特功效。這一極其創意的廣告為雲南白藥贏得了巨大的市場,也使其產品為廣大消費者所熟悉,創造了家喻戶曉的品牌效應。成語接龍是一種人們喜聞樂見的遊戲。就遊戲規則來講非常簡單,即用前乙個...