設計模式 - 命令設計模式 (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方式執行
留言
張貼留言