なんかの Log

良い感じで投げっぱなしにしてみせる。

Observerとかdelegateとか

delegateってなんだっけとか調べてるうちにobserverパターンってなんだっけとなって、まるで覚えてないから書いた。
基本うぃきぺさんのUML参考。

Observer パターン - Wikipedia

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");
        }
        
    }

参考