跳至內容
Bluebean 的筆記
Go back

設計模式筆記—Active Object Pattern (舊)

Warning

本文作為自己的筆記,是依照自身的理解所編寫的,不是很嚴謹 如果有什麼錯誤的地方,可以在下方的 gitalk 留言通知我

Active Object Pattern 是一個實做多執行緒工作的技術,它會配合著 一起使用

下面是一個簡單的 Active Object :

// ICommand.cs
public interface ICommand {
    void Execute();
}

// ActiveObject.cs
public class ActiveObject {
    List<ICommand> commands = new List<ICommand>();
    
    public void AddCommand(ICommand command) {
        this.commands.Add(command);
    }
    
    public void Run() {
        while (this.commands.Count > 0) {
            this.commands[0].Execute();
            this.commands.RemoveAt(0);
        }
    }
}

你可以發現 Active Object 就只是一直執行指令而已,有趣的是,當有你一直從增加指令進去,Active Object 是不會停下來的。因此可以透過不斷的重放同一個指令來達到延遲的效果:

public class DelayPringMessageCommand : ICommand {
    ActiveObject activeObject;
    bool start = false;
    DateTime startTime;
    int delay;
    string message;
    
    public DelayPrintMessageCommand(ActiveObject activeObject, string message, int ms) {
        this.activeObject = activeObject;
        this.message = message;
        this.delay = ms;
    }
    
    public void Execute() {
        DateTime currentTime = DateTime.Now;
        if (!start) {
            this.start = true;
            this.startTime = currentTime;
            this.activeObject.AddCommand(this);
            return;
        }
        
        TimeSpan elapsed = currentTime - this.executeTime
        if (elapsed.TotalMilliseconds < this.delay) {
            this.activeObject.AddCommand(this);
            return;
        }
        Console.WriteLine(this.message);
    }
}

與一般執行緒不同,Active Object 中的指令並不會在等待執行時進行阻塞,而是會一直把自己加回去指令串列,等待再次執行。

只要一直有指令加進去,這個程式就不會結束,它將會執行到所有任務都結束為止。


分享文章:

Previous
設計模式筆記—Command Pattern (舊)
Next
基本資料型別