設計模式 - 策略模式 (Behavioral Patterns - Strategy Design Pattern)

前言

策略模式,主要是讓相似的行為一起時做一個介面,並且可以抽換他們。在沒使用策略模式前,我們可能會用大量的if/else or swithc去撰寫我們的邏輯,而透過策略模式可以將每個邏輯包裝好,並且透過介面方法執行。

類別圖

  • 將我們要執行的演算法繼承一個策略的介面
  • 客戶端統一呼叫此策略介面的方法

這代表著我隨時可以抽換不同的演算法

範例

英雄遊戲的技能施放,技能施放不管是怎樣的效果,他都是一個技能,非常適合用策略模式來撰寫。

  • 我們火焰攻擊和治癒都是實作Skill介面
  • 在SkillService中,再透過Map和String的比對拿出Skill實做並且使用
import java.util.HashMap;
import java.util.Map;

interface Skill {
    void doAction();
}

class FireSkill implements Skill {
    @Override
    public void doAction() {
        System.out.println("Use fire to attack");
    }
}

class HealSkill implements Skill {
    @Override
    public void doAction() {
        System.out.println("Heal myself");
    }
}

class SkillService {
    private Map<String, Skill> skillMap = new HashMap<>();

    public SkillService() {
        skillMap.put("FireAttack", new FireSkill());
        skillMap.put("Heal", new HealSkill());
    }

    public void doAction(String skillType) {
        Skill skill = skillMap.get(skillType);
        skill.doAction();
    }
}

public class Strategy {

    public static void main(String[] args) {
        SkillService skillService = new SkillService();
        skillService.doAction("FireAttack");
        skillService.doAction("Heal");
    }

}

原始碼下載

結論

策略模式算是目前階段我個人最常用的Design Pattern,我個人對他的感覺

  • 可以替代if/else (switch),讓我的單元測試更好撰寫
  • 擴充方便 (需要增加演算法只要繼承繼續往下寫)

留言

這個網誌中的熱門文章

Java Lambda Map篇

(InterviewBit) System Design - Design Cache System

設計模式 - 享元模式 (Structural Patterns - Flyweight Design Pattern)