淺讀《大話設計模式》
----------------2、商場促銷-----策略模式
從本章我首先得到的第一個信息是:策略模式的問題,簡單工廠模式也能實現;推而廣之,同一個問題,可能許多模式都能實現,但是這里總存在一個更優的問題。至于真正用那個模式,就是C++之父的那句話了:需要經驗智慧了。
第二個馬上引出問題的結論:“面向對象的編程,并不是類越多越好,類的劃分是為了封裝,但分類的基礎是抽象,具有相同屬性和功能的對象的抽象集合才是類”。這一句,我覺得是最深刻的道出類設計原則的精辟之語。意思:第一、類并非越多越好,設計一個類是有價值有意義的:是為了封裝(簡單工廠的那個工廠類就是一個純封裝作用的類,但大多數情況建立一個類還需要別的理由,可能簡單工廠屬于一個特例)。第二、何時設計類,當處理的看似一些雜亂無章的東西具有相同的屬性和功能時,就有必要創建類,因為,用對象實現某些功能在可維護可復用等方面要比直接的函數過程似的編程要好得多。以上兩點,可能就是怎樣將實際問題抽象成類的秘訣了!
當時我看到現金收費工廠類時,我心里已經為“菜鳥”拍案叫絕了。他的學習能力好強呀!⊙﹏⊙b汗!然而,大鳥后面的那些一針見血的話同時也讓我進入了沉思。。。當我們發現自己好不容易掌握了一樣東西,我們似乎認為自己學得是易筋經,以后就可以以此橫掃天下了,但是還沒出走出山門,就被路上的山賊給鄙視了。。。這可能是少林寺有了易筋經還要有72絕技的原因。。。
被鄙視的原因:簡單工廠模式只是解決了對象的創建問題,工廠需要包括所有的對象的創建,如果對象形式經常變化,就需要經常改動工廠,以致代碼重新編譯。結論:面對對象形式不斷變化的情況,應該采取比工廠模式更好的武功!
幸虧這本秘籍并不難找:策略模式---它定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。[DP]
問題:在2.7策略模式解析之上的部分,作者最終利用的方法是將策略模式與簡單工廠模式結合起來用,當然與之對比的簡單工廠模式顯然稍遜一籌。但是我個人的觀點是:此處采用單純的策略模式而不是兩者結合更好。即2.5的實現,因為我認為:加入工廠模式就同時將本問題中工廠模式的問題帶進來了,策略模式的Context需要經常重新編譯;而相對于算法經常變化的情況,將算法選擇交給客戶端應該還是可取的。現對而言,我認為前者更好操作。不夠,當我讀到本章最后時,我才又一次發現我的孤陋寡聞!還有更好的招!后面再學。
策略模式的關鍵之一----------Context:“策略模式的Strategy類層次為Context定義了一系列的可供重用的算法或行為。繼承有助于析取出這些算法中的公共功能”。
策略模式理解核心-------------“策略模式就是用來封裝算法的,但在實踐中,我們發現可以用它來封裝幾乎任何類型的規則,只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性[DPE]”。
在基本的策略模式中,選擇所用的具體實現的職責由客戶端對象承擔,并轉給策略模式的Context對象[DPE]。這是策略模式本身純粹的定義,所以,“選擇所用最終怎樣處理”還有很多文章可做!
“反射反射,程序員的快樂”,我以前又從來沒有聽過。。。怎么讓我想起了慕容家族的絕技-----斗轉星移了呢?我的神呀?