策略模式
一個父類镀层,有多個子類(出現(xiàn)了繼承)嗜浮,需要添加一個是共有行為方法,但是并不是每個子類的實現(xiàn)都是同樣的丹禀,且 有一部分是同樣的状勤。這種情況下如果使用繼承的方式,有如下兩種方法
- 方法的實現(xiàn)放在父類中湃崩,那么對于有些子類(與父類的實現(xiàn)不一致)荧降,就需要 override 父類方法。
這種方法的缺點是攒读,有的子類需要 override 父類方法朵诫,而且有哪些子類漏掉了,編譯無法發(fā)現(xiàn)薄扁,會出問題剪返,不符合面向?qū)ο笏枷搿?/p>
- 抽象方法放在父類中废累,讓各個子類去實現(xiàn)。
編譯器可以發(fā)現(xiàn)錯誤脱盲,不會存在漏掉的場景邑滨,但是每個子類都需要實現(xiàn)一遍此方法,代碼沒有復用钱反,也不符合面向?qū)ο笏枷搿?/p>
這種場景就應該采用策略模式掖看,將此方法定義為接口,父類中使用此接口做為成員變量(組合)面哥,通過這個成員變量執(zhí)行具體動作哎壳,子類實現(xiàn)的時候只需要根據(jù)自己的行為生成相應的成員變量
策略模式避免上面說的兩種問題,避免了某些子類 override 父類方法尚卫,避免了潛在的出問題的可能归榕, 避免了同樣的代碼 copy 多份的問題。
說白了就是不使用繼承吱涉,使用組合刹泄,起個個名字叫做策略模式,一下就高大上了怎爵。
很多人總說涉及模式跟語言無關特石,我覺得這些人大部分是人云亦云,拾人牙慧疙咸,比如在 golang 中县匠,只要不是腦回路特別清奇,都能在不懂設計模式的情況下寫出所謂的策略模式撒轮,因為 golang 中不存在繼承,都是面向接口編程贼穆。