「JAVA言語で学ぶデザインパターン入門」をC#で書いてみた【Observerパターン】

「増補改訂版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:*******
(以下略)

その他のデザインパターンは以下の記事から確認してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA