什么是命令模式?
核心思想是將原本直接調用的方法封裝為對象(如
AttackCommand
),對象包含??執行邏輯??和??上下文信息??(如目標、參數)。比如,玩家的按鍵操作被封裝成一個命令對象,而不是直接調用角色的方法,可以支持撤銷/重做。這樣可以將請求的發起者和執行者解耦
如何將"行為請求者"與"行為實現者"解耦?將一組行為抽象為對象,可以實現二者之間的松耦合,這是命令模式的使用場景。
使用時機:當需要先將一個函數登記上,然后再以后調用此函數時,就需要使用命令模式,其實這就是回調函數。
有時候需要向某些對象發送請求,但是并不知道請求的接收者是誰,也不知道被請求的操作是什么。此時希望用一種松耦合的方式來設計程序,使得請求發送者和請求接收者能夠消除彼此之間的耦合關系
例子:拿訂餐來說,客人需要向廚師發送請求,但是完全不知道這些廚師的名字和聯系方式,也不知道廚師炒菜的方式和步驟。 命令模式把客人訂餐的請求封裝成 command 對象,也就是訂餐中的訂單對象。這個對象可以在程序中被四處傳遞,就像訂單可以從服務員手中傳到廚師的手中。這樣一來,客人不需要知道廚師的名字,從而解開了請求調用者和請求接收者之間的耦合關系
什么是觀察者模式?
觀察者模式是關于多個對象想知道一個對象中數據變化情況。是一種一對多的依賴關系,當一個對象的狀態發生變化時,所有它的“觀察者”都得到通知。
主要解決:一個對象狀態改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。
事件
一個類對象可以通過事件來通知別個類對象,如果這個事件發生了,那么關心、訂閱這個事件的對象們會紛紛作出反應事件必須用委托類型來聲明,并且只能由該委托類型來訂閱
委托
用于將方法作為參數傳遞給其他方法,是引用類型使用delegate關鍵字來聲明一個類型,然后再創建這個委托類型實例
委托的優勢:多播和動態綁定
Action委托:指向一個無返回值的方法
Func委托:指向一個有返回值的方法
使用場景
(1)當一個對象的數據更新時需要通知其他對象,但這個對象又不希望和被通知的那些對象形成緊耦合。
(2)當一個對象的數據更新時,這個對象需要讓其他對象也各自更新自己的數據,但這個對象不知道具體有多少對象需要更新數據
觀察者模式滿足“開-閉原則”
對擴展開放??
??新增觀察者無需修改主題代碼
??主題可以動態增減觀察者
對修改關閉??
- ??主題的邏輯不因觀察者變化而修改
什么是狀態模式?
主要解決:當控制一個對象狀態的條件表達式過于復雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把復雜的判斷邏輯簡化。
意圖:允許一個對象在其內部狀態改變時改變它的行為
使用狀態模式,可以很好地避免過多的if–else –分支,狀態模式將每一個狀態分支放入一個獨立的類中,每一個狀態對象都可以獨立存在,程序根據不同的狀態使用不同的狀態對象來實現功能
要使用狀態模式,我們必須明確兩個東西:狀態和每個狀態下執行的動作。
在狀態模式中,因為所有的狀態都要執行相應的動作,所以我們可以考慮將狀態抽象出來。
狀態的抽象一般有兩種形式:接口和抽象類。如果所有的狀態都有共同的數據域,可以使用抽象類,但如果只是單純的執行動作,就可以使用接口。
狀態模式和策略模式的不同?
用狀態模式的情況??
? ??對象行為由內部狀態決定??(如角色狀態、AI行為)。
? ??狀態之間有邏輯關聯??(如“待機→行走→攻擊→待機”)。
? ??狀態轉換由對象內部管理??(如角色自動進入下一個狀態)。
??用策略模式的情況??
? ??需要動態切換算法??(如不同武器效果、排序算法)。
? ??策略之間無邏輯關聯??(如火焰、冰凍、雷電是獨立的)。
? ??客戶端決定使用哪種策略??(如玩家選擇武器)。