首頁 » 設計模式 » 命令(Command)

命令(Command)

作者:

分類:

命令(Command)

概念

命令模式是一種行為型模式,目的是將處理指令物件化,並用命令池做為緩衝,可以做到命令排程處理的架構。使用者下指令時不會立即執行,而是會把命令暫存到命令池內,由執行者來決定何時執行命令。

範例

//**************
//* author: cian
//* 20231105
//**************

/* Command */
abstract class Command
{
    protected abstract bool Action();
}
class Command1 : Command
{
    protected override bool Action()
    {
        Console.WriteLine("Do Command 1.");
        return true; //if success.
    }
}

class Command2 : Command
{
    protected override bool Action()
    {
        Console.WriteLine("Do Command 2.");
        return true; //if success.
    }
}

class Command3 : Command
{
    protected override bool Action()
    {
        Console.WriteLine("Do Command 3.");
        return true; //if success.
    }
}

class CommandPool
{
    private readonly Queue<Command> pool = new Queue<Command>();
    public void SetCommand(Command cmd)
    {
        pool.Enqueue(cmd);
    }
    
    public void Excute()
    {
        Command cmd = pool.Dequeue();
        
        if(!cmd.Action()) //if excute failed. use try...catch better.
        {
            pool.Enqueue(cmd); //cmd push back.
        }
    }
}


class MainApp
{
    static void Main(string[] args)
    {
        CommandPool commandBuffer = CommandPool();
        commandBuffer.SetCommand(new Command1);
        commandBuffer.SetCommand(new Command2);
        commandBuffer.SetCommand(new Command3);
        
        commandBuffer.Excute();
        commandBuffer.Excute();
        commandBuffer.Excute();
    }
}

結語

常見的狀況是指令的執行時間很久,需要依序執行否則會影響系統運作;或是不須立即處理的作業,可以累計到一定數量後再一次執行的批次作業。

近期遇到請求變多,原本定時批次存檔會造成系統崩潰的問題,後來改成不定時定量的批次存檔,藉此來降低系統負載,所以如何應用需取決於系統架構及資源分配。

以上為學習過程的問題紀錄
如果文章有誤,歡迎前輩留言請不吝指教。

「cian」的個人頭像

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *