Observerとかdelegateとか
delegateってなんだっけとか調べてるうちにobserverパターンってなんだっけとなって、まるで覚えてないから書いた。
基本うぃきぺさんのUML参考。
JavaにはObserverクラスがutilにあるので見慣れたListenerという命名に。
public interface Subject { public void notifyListeners(); public void addListener(Listener l); public void deleteListener(Listener l); }
public interface Listener { public void update(); }
public class ConcreteSubject implements Subject { List<Listener> listners = new ArrayList<Listener>(); @Override public void notifyListeners() { for (Listener l : listners) { l.update(); } } @Override public void addListener(Listener l) { listners.add(l); } @Override public void deleteListener(Listener l) { listners.remove(l); } }
見慣れた形ができた。本当ならListenerインターフェイスを実装したコンクリートクラスで書くのが基本。あんま使わないけど。
public class Main { public static void main(String[] args) { Subject s = new ConcreteSubject(); s.addListener(new Listener() { @Override public void update() { System.out.println("listener1"); } }); s.addListener(new Listener() { @Override public void update() { System.out.println("listener2"); } }); s.notifyListeners(); } }
C#のdelegateを使うともっと簡単らしい。名前付けは許して…。
class Observer { private delegate void Listener(); public static void Main(string[] args) { IList<Listener> listeners = new List<Listener>(); listeners.Add(new Listener(Listener1)); listeners.Add(new Listener(Listener2)); foreach (Listener l in listeners) { l(); } } private static void Listener1() { Console.WriteLine("listener1"); } private static void Listener2() { Console.WriteLine("listener2"); } }
参考