Strategy是屬於Behavioral Patterns的其中一種,我個人覺得這個模式非常好用,今天就帶給大家認識認識!
假設有個應用程式提供了一個功能,自動規劃路線,只要使用者在地圖上輸入目的地與出發地地址,程式就會顯示到達目的地最快的路線圖。而這個程式目前只提供汽車行駛道路的路線規劃,但隨著使用者需求越來越多,程式的功能也跟著需要更新,例如新增規畫行人路線的功能,或是規劃公共運輸的路線,什麼時間點要到哪裡搭車等等。
然而隨著不同的需求,就會需要不同的演算法來規劃路線,如此就會造成規劃路線的這個類別,在每一次新增一個演算法時,此類別就會長大一倍,若不幸碰到需更改某個算法,不管是輕微的調整或是錯誤的修正,都會影響整個類別在程式運行發生錯誤的機率。
策略模式會將不同的演算法提取出來,並各自為一個單獨的類別,接著會需要一個Context類別並具備Strategy類別的屬性,使它可以去呼叫該策略的演算法,透過這樣的方式,就可以直接新增新的策略或是修改現有的算法,不需要更改Context類別或其他策略類別的程式,彼此也就不會互相影響了。
class Context {
private Strategy strategy;
public void setStrategy(Strategy s) {
this.strategy = s;
}
public Type work() {
strategy.execute(data);
}
}
interface Strategy {
public Type execute(Type data);
}
class ConcreteStrategy1 implements Strategy {
public Type execute(Type data) {
// algorithm1
}
}
class ConcreteStrategy2 implements Strategy {
public Type execute(Type data) {
// algorithm2
}
}
由程式碼可以看到,不同的策略就有不同的演算法,可以想像一下,當你選擇汽車路線的時候,程式就會幫你設定成規劃汽車路線的演算法(例如setStrategy(Strategy CarStrategy)),此時你再點擊規劃的按鈕,Context就會去呼叫CarStrategy的execute()將路線規劃出來。
以上就是Strategy的介紹,希望大家可以好好使用此模式(真的很好用XD)。
除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章
juck30808 - Python - 數位行銷分析與 Youtube API 教學
SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?