// 下階層用テンプレート
#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;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS