// 下階層用テンプレート #topicpath ---- //ここにコンテンツを記述します。 JavaではイベントハンドラなどObserver/Subjectなパタンは下記のようなコードになりますが、C#ではdelegateやeventなど言語レベルでいろいろサポートされてるみたいです ** まずはJavaで [#i8c4ed03] public class Program { public static void main(String[] str) { new Program(); } public Program() { Subject obj = new Subject("hogehoge"); obj.addObserver(new MyObserver()); obj.notifyObservers(); } static void action(String str) { System.out.println(str); } class MyObserver implements Observer { public void update(String str) { action(str); } } } interface Observer { void update(String str); } class Subject { private String str; private Observer observer; public Subject(String str) { this.str = str; } public void notifyObservers() { observer.update(str); } public void addObserver(Observer observer) { this.observer = observer; } } こんなヤツですね **まずはC#でJavaっぽく [#w907eec3] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ObserverSample { class Program { static void Main(string[] args) { new Program(); } public Program() { Subject obj = new Subject("hogehoge"); obj.addObserver(new MyObserver()); obj.notifyObservers(); } static void Action(String str) { Console.WriteLine(str); } class MyObserver : Observer { public void update(String str) { Action(str); } } } } namespace ObserverSample { // 以下はJavaと全く同じコード interface Observer { void update(String str); } class Subject { private String str; private Observer observer; public Subject(String str) { this.str = str; } public void notifyObservers() { observer.update(str); } public void addObserver(Observer observer) { this.observer = observer; } } } **次にC#でdelegateを使ってみる [#hd16a74c] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ObserverSample2 { class Program { static void Main(string[] args) { new Program(); } public Program() { Subject obj = new Subject("hogehoge"); obj.update += new update(Action); //<-C#ではこうやってObserverを追加する //obj.addObserver(new MyObserver()); obj.notifyObservers(); } static void Action(String str) { Console.WriteLine(str); } //class MyObserver : Observer //{ // public void update(String str) // { // Action(str); // } //} } } namespace ObserverSample2 { // Observerのインタフェースは使わない //interface Observer //{ // void update(String str); //} // Observerのインタフェース(リスナ)のメソッドをdelegateで宣言 delegate void update(String str); class Subject { private String str; // フィールドの変数をdelegateに変更する //private Observer observer; public update update; // <-実はdelegate public Subject(String str) { this.str = str; } public void notifyObservers() { //observer.update(str); update(str); //delegateに処理を委譲する } // addは使わない(+=で追加するので) //public void addObserver(Observer observer) //{ // this.observer = observer; //} } } これでいいみたいです。これいいですね -余計なインタフェースがいらなくて、処理がすっきりする -addObserverとかremoveObserverとか書かなくても+=,-=で追加削除ができる -SubjectのフィールドをSetとかMapにしなくても obj.update += new update(Action1); //<-C#ではこうやってObserverを追加する obj.update += new update(Action2); //<-C#ではこうやってObserverを追加する などとして追加削除ができる などなどいろいろメリットがありますね ---- この記事は #vote(おもしろかった,そうでもない) #comment #topicpath SIZE(10){現在のアクセス:&counter;}