hf ch6 命令模式

2021-10-23 03:47:32 字數 3939 閱讀 6422

0. 序

不知道怎麼寫序了 遇到了乙個之前未遇到的模式。

這一章看到尾確實是太僵硬了,後面會附上我在這章的練習**!

1. 命令模式

命令模式將「請求」封裝成物件,以便使用不同的請求,佇列或者日誌來引數化其他物件,命令模式也支援可撤銷的操作。

命令模式可將「動作請求者」從「動作執行者」物件中解耦。例如:按下按鈕後,遙控器就要把電燈開啟,那麼在此遙控器的實現中就有電燈物件的直接參與造成耦合。–> 如何解耦–> 把請求封裝(如開啟電燈)成乙個特定物件,那麼,如果該按鈕儲存乙個命令物件,那麼當按鈕按下後,就可以命令物件做相應的工作,而不需要知道工作內容是什麼。

例子:餐廳中客人點餐,服務員拿了訂單,服務員把訂單放到視窗,廚師根據訂單準備餐點。在這裡訂單即封裝了點餐請求(發出命令),服務員傳遞訂單到視窗(命令傳遞),這裡服務員不需要知道訂單上有什麼,已經訂單給誰。廚師準備餐點(命令實現)。

空物件的使用 指的是不幹任何事的物件,可用避免在使用該種類物件時判斷if(command!=null) command.execute();使用空物件只管呼叫execute()即可,如果為空的話它什麼也不會做(p214)

class

onecommand

implements

commend

}class

nocommand

implements

commend

}

2. exercise code

個人因為這一章的模式之前未接觸過,在看書的過程中有似懂非懂的感覺 過完這一章後來梳理一下**

例子:遙控器的實現

public

class

light

;public

void

off();

}

//先不使用命令模式 對乙個遙控器該如何實現

/** * 假設遙控器有三個槽

* 每個槽對應開 關 兩個按鈕 on off

*/public

class 遙控器

else

if(slot1==door)..

..}.

..}//很顯然 這裡會有很多if-else 並且如果新增加乙個槽的功能,就要加乙個if-else 不好維護

因此,採用命令模式,將遙控器的指令封裝起來–command, 該封裝帶有乙個執行方法execute(), 在獲取command物件後執行execute()即可完成命令

/**

* 封裝命令的物件

*/public

inte***ce

command

/**

* 燈亮

*/public

class

lightoncommand

implements

command

@override

public

void

execute()

}

/**

* 遙控器

*/public

class

remotecontrol

public

void

setslot

(command slot)

public

void

button1_1pressed()

}//測試

public

static

void

main

(string[

] args)

實現多個槽的遙控器 並帶有撤銷命令 關於撤銷操作,書中的想法很簡單,拿出乙個變數來記錄上一次的命令,若撤銷按下則執行該變數記錄的命令的undo方法,這裡我在想把undo也可撤銷,如果要實現這一功能的話就需要記錄下undo對應的功能和槽號了。

高階的撤銷功能,狀態撤銷–電風扇的「低,中,高 」三檔

/**

* 風扇類

*/public class ceilingfan

public void high()

public void medium()

public void low()

public void off()

public int getspeed()

}

//高命令 中 低 關閉命令類似

public

class

ceilingfanhighcommand

implements

command

@override

public

void

execute()

@override

public

void

undo()

}

//測試

ceilingfan ceilingfan_room=new ceilingfan("房間");

ceilingfanhighcommand ceilingfanhighcommand=new ceilingfanhighcommand(ceilingfan_room);

celifanmediumcommand celifanmediumcommand=new celifanmediumcommand(ceilingfan_room);

celifanlowcommand celifanlowcommand=new celifanlowcommand(ceilingfan_room);

celifanoffcommand celifanoffcommand=new celifanoffcommand(ceilingfan_room);

advancedremotecontrol.setcommand(4,ceilingfanhighcommand,celifanoffcommand);

advancedremotecontrol.setcommand(5,celifanmediumcommand,celifanoffcommand);

advancedremotecontrol.setcommand(6,celifanlowcommand,celifanoffcommand);

advancedremotecontrol.hasonbuttonwaspressed(4);//高

advancedremotecontrol.hasonbuttonwaspressed(5);//中

advancedremotecontrol.undobuttonwaspressed();

當前執行:房間 high

當前執行:房間 medium

當前執行:房間 high

3. 擴充套件

一趟走下來發現命令模式其實就是 把一堆的指令封裝起來(封裝成command) 呼叫者只需要 對command執行execute()即可,不需要關心該命令如何實現的,不關心該命令的接收者,實現解耦。 即 風扇是乙個接收者,開啟/調速風扇是指令,將這種指令封裝成命令(command) ,在命令封裝的過程中就已經確定了該命令的接收者(構造器構造), 再然後在遙控器(呼叫者)上設定按鈕對應的命令,只要按鈕被按下就執行execute()方法。

這種情況下,工作佇列中的類與進行運算的執行緒之間是完全解耦的,執行緒只需要執行佇列中的execute()方法即可,而不必關係這個物件是去讀取網路資料還是進行數學計算。

6 命令模式

head first design patterns master src headfirst designpatterns command 把方法呼叫封裝起來,可以把運算塊包裝成形。定義 將 請求 封裝成物件,以便使用不同的請求,佇列或者日誌來引數化其他物件,命令模式也支援可撤銷的操作。例子 餐廳...

HeadFirst 設計模式學習筆記6 命令模式

1.這一節我們的任務是建立乙個類似智慧型家居的萬能遙控器,控制各種家電。我們需要將 請求 封裝成物件 乙個命令物件通過在特定接收者上繫結一組動作來封裝請求 以便使用不同的請求 佇列 或者日誌來引數化其物件 這就是命令模式。2.我們具體來看乙個例子 首先我們要完成對命令的物件封裝 只有乙個方法,所有的...

設計模式6

template method模式 我們講的前面很多模式的思路都是使用組合,而不用繼承。並且也提到了乙個設計原則 優先使用組合 但是這個模式就是乙個使用繼承來解決問題的思路。畢竟,繼承也不是一無是處。在有些系統中,乙個事務的完成需要通過一系列的步驟,就是第一步幹什麼,第二步幹什麼。這個步驟的序列是固...