- 追加された行はこの色です。
- 削除された行はこの色です。
// 下階層用テンプレート
#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;}