「増補改訂版Java言語で学ぶデザインパターン入門」の「Observerパターン」をC#で書いてみました。
GitHubにもコードを置いています。
参考
DesignPattern【Observer】GitHub
IObservable、IObserverを使用したバージョンも用意しています。
参考
DesignPattern【Observer2】GitHub
コード
public interface IMyObserver
{
void Update(NumberGenerator generator);
}
public abstract class NumberGenerator
{
private IList IMyObserver> observers = new List IMyObserver>();
public void AddObserver(IMyObserver observer)
{
observers.Add(observer);
}
public void DeleteObserver(IMyObserver observer)
{
observers.Remove(observer);
}
public void NotiffyObserver()
{
var it = observers.GetEnumerator();
while (it.MoveNext())
{
it.Current.Update(this);
}
}
public abstract int GetNumber();
public abstract void Execute();
}
ppublic class RandomNumberGenerator : NumberGenerator
{
private Random random = new Random();
private int number;
public override void Execute()
{
for(int i = 0; i 20; i++)
{
number = random.Next(50);
NotiffyObserver();
}
}
public override int GetNumber()
{
return number;
}
}
public class DigitObserver : IMyObserver
{
public void Update(NumberGenerator generator)
{
Console.WriteLine($"DigitObserver:{generator.GetNumber()}");
Thread.Sleep(100);
}
}
public class GraphObserver : IMyObserver
{
public void Update(NumberGenerator generator)
{
Console.Write("GraphObserver:");
int count = generator.GetNumber();
for (int i = 0; i count; i++)
{
Console.Write("*");
}
Console.WriteLine("");
Thread.Sleep(100);
}
}
class Program
{
static void Main(string[] args)
{
NumberGenerator generator = new RandomNumberGenerator();
IMyObserver observer1 = new DigitObserver();
IMyObserver observer2 = new GraphObserver();
generator.AddObserver(observer1);
generator.AddObserver(observer2);
generator.Execute();
}
}
実行結果は以下のようになります。
DigitObserver:5
GraphObserver:*****
DigitObserver:5
GraphObserver:*****
DigitObserver:27
GraphObserver:***************************
DigitObserver:19
GraphObserver:*******************
DigitObserver:3
GraphObserver:***
DigitObserver:12
GraphObserver:************
DigitObserver:36
GraphObserver:************************************
DigitObserver:7
GraphObserver:*******
(以下略)
その他のデザインパターンは以下の記事から確認してください。