一 策略模式

2021-07-11 17:14:15 字數 1199 閱讀 6832

下面全是個人理解。

head first 第一章中講的策略模式,我覺得是所有設計 模式中最基本的。

它提到了幾個設計原則:都是我們平常程式設計中用到的。

1:將應用中變化之處和,不需要變化之處分離出來。這其實就很類似,封裝的定義;

2:面向介面程式設計,而不是面向實現程式設計。想想我們在做web專案時,servie層,以及dao層,都是面向介面程式設計的,為的就是如果換掉資料庫實現,那麼在action層,我們就不需要更改**了。

3:少用繼承,多用組合。我們在做web專案時,service實現中,包含有dao的引用 ,其實就是組合。而且這種組合是高內聚,低耦合的。因為我們可以在執行時,指定特定的dao實現。這也是一種面向介面程式設計。

head first 第一章針對duck(鴨子)類 做了乙個**。

duck 書中定義的是抽象類,它有quack() 呱呱叫的方法,以及swim() 游泳的方法,還有乙個抽象方法display()  外觀方法。每種鴨子,都繼承duck類,自己實現display方法。

需求1:現在在duck中增加乙個方法fly()方法,由於 使用的繼承,那麼所有實現了duck的子類 ,都有fly方法,就是會飛。但是問題來了,由於使用的是繼承,會導致有些 不會飛的鴨子也擁有這個方法,有的人說,會飛就會嘛,有什麼 關係,但是 你自己不覺得很怪嗎?還有人覺得,我讓不會飛的鴨子重寫fly()方法,讓它什麼 都不做不就可以了嗎?咋一想,好像是這麼一回事,但是,如果有這麼 一種鴨子,不會飛也不會叫還不會游泳,那麼 你完蛋了,這個時候,你要檢查所有的子類了,看看它們的所有方法,是否滿足條件了、

所以繼承帶來的問題就是,子類繼承了不必要的一些行為。

這個時候,我想要了介面,把鴨子的每種行為定義成乙個介面,讓那麼需要有這些行為的鴨子去實現它,就可以了。哎,仔細想想,好像可以。

需求2:假如有三個子類分別實現了duck,按照上面的想法,定義乙個fly方法,quack(),swim()。那麼這三個子類,如果三個子類fly,swim,quack的實現都是一樣,那麼 這樣 **是不是重複寫了很多呀!!現在只是三個子類,如果30個呢,想想。

需求3:講到這裡,head first 講到了最後的解決方案,其實也是用到了介面,只是和上面不一樣,它是定義一組介面行為,只是它由一組專門實現介面行為的類來實現,而不是由鴨子類來實現,我們只需要在duck類中定義一些鴨子類的行為,具體的實現,在執行時,自己定義。這樣,即使再增加一些行為,也只需要在duck類中定義這些行為,具體的實現,就不關鴨子的事情了。

設計模式(一) 策略模式

設計模式 一 策略模式 本文描述的是策略模式 我們假設有如下場景 我們使用聊天工具聊天時,可以傳送點對點訊息 私聊 和點對多訊息 群聊 而傳送不同的訊息執行的操作是不一樣的,也就是說我們在不同的場景下 私聊或者群聊 傳送訊息時會呼叫不同的傳送方法,但是我們只有乙個訊息傳送器 可以理解為傳送訊息時的傳...

設計模式(一) 策略模式

一 模式動機 為什麼要使用策略模式呢?在日常開發中,我們可以發現一種需求可以有不同的方法來實現,比如我們要對乙個陣列進行排序,就可以使用多種不同的排序方法 選擇排序 氣泡排序 快速排序等 每一種排序方法都可以被稱作一種策略,我們可以在不同的情況下來選擇不同的策略進行排序。在實現的時候我們可能會寫乙個...

設計模式 一 策略模式 1

策略模式用到就是 多型 的思想,父類有多個子類,為同乙個行為實現不同的表現形式 舉例 1個中國人,1個印度人,他們都吃飯,但是中國人是用筷子,印度人是用手,這個就是多型,同一行為的2種實現方式 吃飯行為 public inte ce eating中國人和印度人 public class chines...