iT邦幫忙

2021 iThome 鐵人賽

DAY 16
1
Software Development

淺談物件導向與Design Pattern介紹系列 第 16

IT鐵人DAY 16-Strategy 策略模式

  Strategy是屬於Behavioral Patterns的其中一種,我個人覺得這個模式非常好用,今天就帶給大家認識認識!


問題情境與解析

  假設有個應用程式提供了一個功能,自動規劃路線,只要使用者在地圖上輸入目的地與出發地地址,程式就會顯示到達目的地最快的路線圖。而這個程式目前只提供汽車行駛道路的路線規劃,但隨著使用者需求越來越多,程式的功能也跟著需要更新,例如新增規畫行人路線的功能,或是規劃公共運輸的路線,什麼時間點要到哪裡搭車等等。

  然而隨著不同的需求,就會需要不同的演算法來規劃路線,如此就會造成規劃路線的這個類別,在每一次新增一個演算法時,此類別就會長大一倍,若不幸碰到需更改某個算法,不管是輕微的調整或是錯誤的修正,都會影響整個類別在程式運行發生錯誤的機率。

  策略模式會將不同的演算法提取出來,並各自為一個單獨的類別,接著會需要一個Context類別並具備Strategy類別的屬性,使它可以去呼叫該策略的演算法,透過這樣的方式,就可以直接新增新的策略或是修改現有的算法,不需要更改Context類別或其他策略類別的程式,彼此也就不會互相影響了。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210930/20140743HiLDQZHkTk.png

Skeleton Code

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)。


除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章

lu23770127 - SASS 基礎初學三十天

10u1 - 糟了!是世界奇觀!

juck30808 - Python - 數位行銷分析與 Youtube API 教學

SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 15-Bridge 橋接模式
下一篇
IT鐵人DAY 17-State 狀態模式
系列文
淺談物件導向與Design Pattern介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言