std.signalsというモジュールを使うとオブザーバー・パターンの実装が簡単にできる。 この例ではひとつのオブザーバーしか登録していないが、複数のオブザーバーを登録した上で一気にシグナルを発行できる。
import std.signals; import std.stdio; enum SignalTypes { INCREASE, DECREASE }; class SignalObserver { private int signalCounter; this() { signalCounter = 0; } void watch(SignalTypes type) { switch (type) { case SignalTypes.INCREASE: signalCounter++; break; case SignalTypes.DECREASE: signalCounter--; break; default: break; } } @property int counter() const { return signalCounter; } } class SignalTrigger { void update(SignalTypes type) { emit(type); } mixin Signal!(SignalTypes); } __gshared SignalTrigger trigger = new SignalTrigger(); __gshared SignalObserver observer = new SignalObserver(); void main() { trigger.connect(&observer.watch); trigger.update(SignalTypes.INCREASE); trigger.update(SignalTypes.INCREASE); trigger.update(SignalTypes.INCREASE); writeln(observer.counter); // 3 trigger.update(SignalTypes.DECREASE); trigger.update(SignalTypes.DECREASE); writeln(observer.counter); // 1 }