JavaではイベントハンドラなどObserver/Subjectなパタンは下記のようなコードになりますが、C#ではdelegateやeventなど言語レベルでいろいろサポートされてるみたいです
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; } }
こんなヤツですね
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; } } }
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; //} } }
これでいいみたいです。これいいですね
obj.update += new update(Action1); //<-C#ではこうやってObserverを追加する obj.update += new update(Action2); //<-C#ではこうやってObserverを追加するなどとして追加削除ができる
などなどいろいろメリットがありますね
この記事は
現在のアクセス:2813