設計模式 - 命令設計模式 (Behavioral Patterns - Command Pattern)

前言

對我個人而言,其實我私心認為Command Pattern與Chain of Responsibility是非常相似的。

Chain of Responsibility意旨將邏輯拆開,透過物件之間的連接做呼叫,物件間的聯就透過建構者或Dependency Inject注入。

而其中的差別在於,粒度的不同,Commande Pattern比較偏向將一個物件原本的method拆解成一個個的Command,而Chain of Responsibility的Handler粒度更大一點,更像是一個個完整邏輯的物件。

類別圖

  • 設計Command介面
  • 實作Command介面並解複寫Execute方法
  • 透過Receiver組裝Command組織成自己的物件邏輯,提供給Client呼叫

範例

英雄遊戲中的,常用組合招式非常適合用Command Pattern實踐,邏輯如下

  • 使用者可以將不同招式組裝成快捷鍵施放
  • 範例: 施毒 -> 祝福(加攻擊力) -> 攻擊

實作過程

  • 設計SkillCommand
  • 設計不同的Skill實作SkillComand並複寫Method實踐自己的邏輯
  • 透過一個Reciver組裝每個Skill包裝成自己的邏輯
  • Client執行
import java.util.LinkedList;
import java.util.Queue;

interface SkillCommand {
    void execute();
}

class Poison implements SkillCommand {

    @Override
    public void execute() {
        System.out.println("Poison your enemy");
    }
}

class Bless implements SkillCommand {

    @Override
    public void execute() {
        System.out.println("Bless yourself");
    }
}

class Attack implements SkillCommand {

    @Override
    public void execute() {
        System.out.println("Attack your enemy");
    }
}

class UserAction {
    private Queue<SkillCommand> combo = new LinkedList<>();

    public void setSkill(SkillCommand skill) {
        combo.add(skill);
    }

    public void useCombo() {
        for (SkillCommand skillCommand : combo) {
            skillCommand.execute();
        }
    }
}

public class Command {

    public static void main(String[] args) {
        UserAction userAction = new UserAction();
        userAction.setSkill(new Poison());
        userAction.setSkill(new Bless());
        userAction.setSkill(new Attack());
        userAction.useCombo();
    }

}

原始碼

結論

  • Command Pattern如同Chain of Responsibilty可以將擁有複雜邏輯的物件與樹狀關係解偶
  • 可以重複使用不同的Command組裝成新的邏輯結構
  • Command可以透過Iterative方式執行

留言

這個網誌中的熱門文章

Java Lambda Map篇

(InterviewBit) System Design - Design Cache System

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