Observer パターンでデリゲートを使用できる場所が 2 つあります。どちらのことを言っているのかわからないので、両方答えようと思います。
1 つ目は、サブジェクトで IObserver のリストの代わりにデリゲートを使用することです。このアプローチは、基本的に
private delegate void UpdateHandler(string message);
private UpdateHandler Update;
public void Register(IObserver observer)
{
Update+=observer.Update;
}
public void Unregister(IObserver observer)
{
Update-=observer.Update;
}
public void Notify(string message)
{
Update(message);
}
それ以外の
public Subject()
{
observers = new List<IObserver>();
}
public void Register(IObserver observer)
{
observers.Add(observer);
}
public void Unregister(IObserver observer)
{
observers.Remove(observer);
}
public void Notify(string message)
{
// call update method for every observer
foreach (IObserver observer in observers)
{
observer.Update(message);
}
}
特別なことをする必要がなく、IObserver オブジェクト全体への参照が必要な場合を除き、デリゲートの方がすっきりすると思います。
2 番目のケースは、たとえば IObervers の代わりに pass デリゲートを使用することです。
public delegate void UpdateHandler(string message);
private UpdateHandler Update;
public void Register(UpdateHandler observerRoutine)
{
Update+=observerRoutine;
}
public void Unregister(UpdateHandler observerRoutine)
{
Update-=observerRoutine;
}
public void Notify(string message)
{
Update(message);
}
これにより、オブザーバーはインターフェースを実装する必要がなくなります。ラムダ式を渡すこともできます。この制御レベルの変化は、かなりの違いです。これが良いか悪いかはあなた次第です。