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

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

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

下面是一個簡單的 Active Object :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 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 是不會停下來的。因此可以透過不斷的重放同一個指令來達到延遲的效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 中的指令並不會在等待執行時進行阻塞,而是會一直把自己加回去指令串列,等待再次執行。

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