设计模式之策略者模式
策略者模式簡介
策略者模式定義一個算法接口,并由其實現(xiàn)類去實現(xiàn),使得每一個算法都得到封裝,并讓他們可以相互替換。這是一種行為型模式。策略者模式降低了算法行為和環(huán)境角色的耦合度,使得算法可以獨立發(fā)生變化。
策略者模式在現(xiàn)實世界的使用很多,比如互金場景中的優(yōu)惠券模式,可以分為本金券,返現(xiàn)券,加息券,增收券等,每種卡券給予用戶享受不同的權(quán)益,如果有一天增加了新的優(yōu)惠券,也很容易擴展進去。由此可見,策略者模式使得業(yè)務(wù)線索更加清晰明了,每種業(yè)務(wù)線索場景彼此互不關(guān)聯(lián),互不影響。
同時,由于并不強耦合企業(yè)業(yè)務(wù),所以當有一天企業(yè)業(yè)務(wù)擴大,并同時需要對卡券進行進一步的權(quán)益擴展的時候,修改起來也會很方便,當然某些可變數(shù)據(jù)是可以通過配置來解決的,這也進一步減少了代碼的修改。
當然,我們也可以看到,根據(jù)特定的場景,充分運用其規(guī)則,并通過配合一些常規(guī)手段來進一步完善和穩(wěn)定系統(tǒng)功能的時候,可以把設(shè)計模式的威力進一步發(fā)揮出來,切記不可拘泥于設(shè)計模式本身。
策略者模式UML類圖
由UML類圖可知策略者模式分為三個角色
Context:此處負責(zé)抽象策略類調(diào)度具體的算法策略,根據(jù)某些具體場景的不同,Context也可以有不同的實現(xiàn)。
Strategy:抽象算法策略類,所以具體策略者的父類,定義了一個抽象的方法,可以是接口也可以是抽象類,我一般使用抽象類,因為我需要對一些數(shù)據(jù)進行特殊的處理后再交給子類。
ConcreteStrategy:具體的算法策略,具體實現(xiàn)抽象的方法。
范例
以下范例,會使用前面所說的互金場景下的卡券,對于用戶來說,就是購買產(chǎn)品時所使用的卡券能為自己帶來多少收益,所以此處把【用】這個算法抽象出來,由每種卡券自己去實現(xiàn)響應(yīng)的算法
策略算法抽象類:
?
?
策略算法具體的四個卡券類
?
策略者上線文類,此處我提供了兩種實現(xiàn)方式:
1、如果策略者上線文類比較簡單,除了對象獲取以外,沒有其他特殊的使用,可以考慮類似于簡單工廠的模式,畢竟,我們在開發(fā)卡券功能時,會提供相應(yīng)的卡券類型枚舉,此處可以借用一下
調(diào)用方式
2、另外一種實現(xiàn)方式,就是采用注入方式,這種實現(xiàn)方式一般用于策略者上下文類功能比較多的情況
調(diào)用方式
策略者模式優(yōu)缺點
優(yōu)點:
很好的體現(xiàn)了開閉原則,開發(fā)者可以在不變更其他具體算法的基礎(chǔ)上新增新的策略類,即便是策略者的具體場景發(fā)生變化,并需要大規(guī)模修改時,也會很容易,因為獨立的場景總會帶來特定的思維模式,讓開發(fā)者不會被其他場景所干擾,也就是所謂的關(guān)注點分離。
避免了大量的if-else
算法可以自由切換
缺點:
有可能會產(chǎn)生大量的策略類,并且所有策略類都會對外暴露
策略者模式使用場景思考
其實這一塊我并不想寫,因為寫了以后,會給人一種思維定勢,但是此處還是需要多討論一下什么場景下去使用策略者模式,我們可以做一個這樣的思考,當代碼中或者即將編寫的功能需要配合大量的if-else,其中的代碼會較為復(fù)雜,并且這些產(chǎn)生if-else出現(xiàn)了較強的邏輯上的關(guān)聯(lián),外界也根本不關(guān)注其中的具體實現(xiàn),在加入一層抽象層后,會使得這些功能更加聚合,更加明確,這個時候,可以考慮使用策略者模式。需要提醒的時候,策略者模式關(guān)注的是對象的行為,如果關(guān)注對象本身,可以使用簡單工廠。
總結(jié)
以上是生活随笔為你收集整理的设计模式之策略者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 译 | .NET Core 3.0 对诊
- 下一篇: Linux下搭建asp.net运行环境