在上一篇中的裝飾者模式學習中,我學習到了一個新的技能就是通過對類的組裝來擴展對象的行為,今天我來再來學一篇新的設計模式-——策略模式,這個模式也是一個對象行為模式
1:什么是策略模式
定義:策略模式屬于對象的行為模式,用意是針對一組算法,然后將每一個算法封裝到具有共同接口的具體類中,從而是這些算法可以相互替換
應用場景:在我們的國家,上班族,公司的收入都需要繳稅,個人有個人所得稅計算公式,民營企業(yè)有民營企業(yè)的所得稅計算公式,外資企業(yè)有外資企業(yè)所得稅的計算方式,這些計算公式都不一樣,但是這些公式的責任都是一樣的,那就是完成,要交納給國家多少錢
場景分析:每一個計算公式都是一個具體的算法,而我們的國家就是一個所得稅計算公式的入口
類圖:

從類圖中我可以看出這個設計模式的核心就是Context 這個入口的類和Strategy這個算法抽象接口
2:如何實現(xiàn)策略模式
這個模式比較簡單,我們就不做過多的文字解釋,還是老規(guī)矩,直接寫code,(這幾個稅收的公式純屬demo演示,不是國家發(fā)布的標準)大家重在理解,策略模式的思想
1:創(chuàng)建稅收總入口類(Context)
2:創(chuàng)建算法的共同接口(Strategy)
3:創(chuàng)建個人所得稅的算法類
4:創(chuàng)建民營公司所得稅的算法類
5:創(chuàng)建外資企業(yè)所得稅的算法類
6:創(chuàng)建測試類
7:下圖是我門的測試結果
通過上面的測試結果,我門可以發(fā)現(xiàn),在整個設計過程中,
1):每一個算法都是獨立的,互不干涉的類,在具體的算法類中只是單純的維護了算法本身與他的職責進行了完全的分離。
2):每個算法的職責都維護在了我們的context類中,在這個類通過維護一個算法共同接口的引用使得具體的算法本身與算法的職責解耦合
3:策略模式在Spring 中的使用
在Spring 中實例化Bean的過程就是使用的策略模式,
AbstractAutowireCapableBeanFactory就等價于我們的context入口類,InstantiationStrategy是具體實例化Bean算法上層接口,SimpleInstantiationStrategy和CglibSubclassingInstantiationStrategy是二個具體的實例化Bean對象的算法類,下面簡單的描述一下這幾個類的工作流程,更詳細的步鄹,大家可以看下spring的源碼。
當AbstractAutowireCapableBeanFactory中的getInstantiationStrategy方法被觸發(fā)后,就會調用InstantiationStrategy中的instantiate,因為在CglibSubclassingInstantiationStrategy中沒有實現(xiàn)方法instantiate,所以會先調用父類的instantiate,然后在這個方法內根據類是否配置lookup-method或者replaced-method標簽或者@Lookup注解,而調用兩種不同的方式實例化bean。
4:策略模式的優(yōu)缺點
優(yōu)點:
? ? ? 通過將算法本身單獨的封裝使得每個算法之間可以自由切換
? ? ? 通過對具體算法的抽象使的整個模式的擴展性好,當有新的算法加入時只需要實現(xiàn)strategy接口即可
缺點:
? ? ? 策略類數量會大量增多,但復用性卻很小
? ? 所有的策略都需要對外暴露,上層模塊必須知道有哪些策略