第21條:用函數(shù)對(duì)象表示策略有些語(yǔ)言支持函數(shù)指針(function pointer)、代理(delegate),、lambda表達(dá)式(lambda expression),,或者支持類似的機(jī)制,允許程序把“調(diào)用特殊函數(shù)的能力”存儲(chǔ)起來(lái)并傳遞這種能力,。這種機(jī)制通常用于允許函數(shù)的調(diào)用者通過傳入第二個(gè)函數(shù),,來(lái)指定自己的行為。 C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的qsort函數(shù)要求用一個(gè)指向comparator函數(shù)的指針作為參數(shù),,它用這個(gè)函數(shù)來(lái)比較待排序的元素,。比較器有兩個(gè)參數(shù),都是指向元素的指針,。通過傳遞不同的比較器函數(shù),,可以獲得不同的排列順序,這是策略模式的一個(gè)例子,。比較器函數(shù)代表一種為元素排序的策略,。 什么是策略模式?策略模式定義了一系列的算法,,并將每一個(gè)算法封裝起來(lái),,而且使它們還可以相互替換,。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
為了把StringLengthComparator實(shí)例傳遞給方法,,需要適當(dāng)?shù)膮?shù)類型。使用StringLengthComparator并不好,,因?yàn)榭蛻舳藢o(wú)法傳遞任何其他的比較策略,。相反,我們要定義一個(gè)Comparator接口,,并修改StringLengthComparator來(lái)實(shí)現(xiàn)這個(gè)接口,。換句話說,我們?cè)谠O(shè)計(jì)具體的策略類時(shí),,還需要定義一個(gè)策略接口(strategy interface),,如下所示:
因?yàn)椴呗越涌诒挥米魉芯唧w策略實(shí)例的類型,所以我們并不需要為了導(dǎo)出具體策略,,而把具體策略做成公有的,。相反,“宿主類(host class)”還可以導(dǎo)出公有的靜態(tài)域(或者靜態(tài)工廠方法),,其類型為策略接口,,具體的策略接口類可以是宿主類的私有嵌套類。下面的例子使用靜態(tài)成員類,,而不是匿名類,,以便允許具體的策略類實(shí)現(xiàn)第二個(gè)接口Serializable:
簡(jiǎn)而言之,,函數(shù)指針的主要用途就是實(shí)現(xiàn)策略(strategy)模式。為了在Java中實(shí)現(xiàn)這種模式,,要聲明一個(gè)接口來(lái)表示該策略,,并且為每個(gè)具體策略聲明一個(gè)實(shí)現(xiàn)了該接口的類。當(dāng)一個(gè)具體策略只被使用一次時(shí),,通常使用匿名類來(lái)聲明和實(shí)例化這個(gè)具體策略模類,。當(dāng)一個(gè)具體策略是設(shè)計(jì)用來(lái)重復(fù)使用的時(shí)候,它的類通常就要被實(shí)現(xiàn)為私有的靜態(tài)成員類,,并通過公有的靜態(tài)final域被導(dǎo)出,,其類型為該策略接口。 來(lái)源:http://www./content-1-225651.html |
|