上文:《PHP設(shè)計(jì)模式介紹》第六章 偽對象模式
《PHP設(shè)計(jì)模式介紹》第七章 策略模式
在編寫面向?qū)ο蟮拇a的時,有些時候你需要一個能夠自己根據(jù)不同的條件來引入不同的操作對象實(shí)例。例如,一個菜單功能能夠根據(jù)用戶的“皮膚”首選項(xiàng)來決定是否采用水平的還是垂直的排列形式,或者一個計(jì)費(fèi)系統(tǒng)可以自行根據(jù)用戶的收貨地址來決定稅率。
一般來講,一個控制菜單的對象實(shí)例包括了add(), delete(), 和 replace()等菜單元素;并通過set()進(jìn)行配置,用render()來管理顯示模式。無論你想生成什么樣子的菜單,你都可以用同一個對象類來處理。不同菜單的對象實(shí)例只是一些方式函數(shù)的運(yùn)算規(guī)則不同罷了,至少在剛才的例子里面render()函數(shù)是不同的。
但是如果你需要增加菜單的顯示模式種類,或者你需要根據(jù)用戶的國家、省份等信息來判斷菜單排列的順序的時候,該怎么做呢?而且如果有許多的方式函數(shù)都是經(jīng)常變化的,那么簡單的類封裝將變得復(fù)雜、難易理解和升級的。
問題
怎么輕松地改變對象實(shí)例的執(zhí)行過程,因而在代碼執(zhí)行的時候動態(tài)地改變執(zhí)行過程?一旦實(shí)現(xiàn)了這個功能,如果去編寫這樣的類定義從而讓維護(hù)和升級變得非常簡單呢?
解決辦法
當(dāng)一個類封裝了多個操作的時候,對象實(shí)例可以動態(tài)地選擇這些操作來進(jìn)行,可以用策略模式來把對象本身和運(yùn)算規(guī)則區(qū)分開來;蛘,更簡單的處理是類里面定義的方式函數(shù)用case語句來進(jìn)行控制。當(dāng)然更簡單的方法是使用策略模式。
策略模式功能非常強(qiáng)大,因?yàn)檫@個設(shè)計(jì)模式本身的核心思想就是面向?qū)ο缶幊痰亩嘈涡缘乃枷搿?/p>
就在編程領(lǐng)域之外,有許多例子是關(guān)于策略模式的。如果我需要在清晨從家里去上班,我可以有幾個策略可以考慮:我可以開車,乘坐公交車,走路,汽車或者甚至是搭乘直升飛機(jī)。每個策略都可以得到相同的結(jié)果,但是它們使用了不同的資源。選擇策略的依據(jù)是費(fèi)用,時間,使用工具還有每種方式的方便程度 。一個很好的策略也許在第二天就不能再被使用的,所以策略的選擇是相對的。
你已經(jīng)在前面的工廠模式章節(jié)看到了和策略模式相似的例子:因?yàn)椴煌匦缘馁M(fèi)用計(jì)算方式不同,所以Monopoly游戲的框架使用了許多相似的特性類,但是因?yàn)橘M(fèi)用的計(jì)算不是從類本身獲得,所以這個費(fèi)用計(jì)算相對來說是一個TemplateMethod 設(shè)計(jì)模式。
出處:
責(zé)任編輯:bluehearts
上一頁 下一頁 php設(shè)計(jì)模式介紹之策略模式 [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|