策略模式的主要目的是將行為與具體的演算法或者實現進行分開。如:條條大路通羅馬。採取不同的路線或者出行方式雖然會出現不同的演算法或實現,但是其最終行為都是去往羅馬。其基本實現如下:
// 宣告使用的演算法介面,不同的演算法通過實現此介面。
type transportation inte***ce
type plane struct
func
(u *plane)
use(
)type train struct
func
(u *train)
use(
)type rome struct
func
(r *rome)
gorome
(u transportation)
現在可以假設乙個場景:周一使用飛機,周二使用火車,週三使用地鐵。如果是樸素的實現方式如下:
package main
import
"fmt"
type rome struct
//gorome dayoftheweek:星期幾
func
(r *rome)
gorome
(dayoftheweek string
)else
if dayoftheweek ==
"tuesday"
else
if dayoftheweek ==
"wednesday"
}func
main()
這裡如果需要增加乙個周四使用輪船則需要增加乙個if else。 當這種if else充斥在**中,並且每個if else**塊都很大時,**則會變得很難維護。並且每次增加if else 都會對原有的**造成較大的改動。很顯然違背了"開閉原則(開閉原則:主要目的是為了減少對原有類的修改。因為對原有類的修改往往都需要閱讀大量的上下文**才能進行對應的修改,這種方式會導致系統的維護難度極具上公升。)",所以這裡應該把抽象的行為和具體的實現演算法分開。如下:
package main
import
"fmt"
type transportation inte***ce
type plane struct
func
(u *plane)
use(dayoftheweek string)}
type train struct
func
(u *train)
use(dayoftheweek string)}
type subway struct
func
(u *subway)
use(dayoftheweek string)}
type rome struct
// 此處將不同的交通工具儲存在transportations
func
(r *rome)
addtransportation
(t transportation)
//gorome dayoftheweek:星期幾
func
(r *rome)
gorome
(dayoftheweek string)}
func
main()
對於使用策略模式,當需要增加乙個新增的交通工具以及特定的條件時,只需要新增乙個交通工具並實現transportation即可。之後將其加入到rome中,而無需改動rome的**。
雖然使用策略模式短期內會增大**量,但是這是值得的。正如《a philosophy of software design》這本書中提到的,採取第一種戰術程式設計的方式短期內的複雜度不會上公升。然而隨著時間的流逝,當功能越來越多並且越來越複雜時,在原有的**上進行改動將會越來越困難。從而導致系統的複雜度大幅度增加。
策略模式的使用場景
當程式 現一堆連在一起的if else語句,例如 public void t else if b else if c else 此時對於這一對if else語句,每個條件a,b,c 可能會很複雜,維護起來也很難,尤其後續新增加不同情況的操作,還需要新增加if else,耦合度太高。故此時可以使用策略...
設計模式應用場景
設計模式應用場景 1 command 建立和執行事務 實體上的解耦 時間上的解耦 undo方法 2 active object模式 該模式與command模式結合 實現多執行緒控制的一項古老的技術,為許多任務業系統提供了乙個簡單的多工核心。3 template method 與 strategy 分...
單利模式應用場景
單例模式應用的場景一般發現在以下條件下 1 資源共享的情況下,避免由於資源操作時導致的效能或損耗等。如上述中的日誌檔案。2 控制資源的情況下,方便資源之間的互相通訊。如執行緒池等。python 1 python 的模組就是天然的單例模式,因為模組在第一次匯入時,會生成 pyc 檔案,當第二次匯入時,...