2006年03月22日

Observer −状態の変化を通知する

  
ここに掲載したコードは、『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』に掲載されているサンプルコードをC#に移植したものです。移植後のコードの公開に関しては、結城氏の了解を得ています。
※当ソースは、Visual C# 2005 Express Editionで動作を確認しています。



IObserverインターフェース
using System;

namespace Gushwell.DesignPatterns {
public interface IObserver {
void Update(NumberGenerator generator);
}
}


NumberGeneratorクラス
using System;
using System.Collections;

namespace Gushwell.DesignPatterns {

public abstract class NumberGenerator {
public abstract int Number { get;}
// Observerたちを保持
private ArrayList observers = new ArrayList();

// Observerを追加
public virtual void AddObserver(IObserver observer) {
observers.Add( observer );
}

// Observerを削除
public virtual void DeleteObserver(IObserver observer) {
observers.Remove( observer );
}

// Observerへ通知
public virtual void NotifyObservers() {
foreach ( IObserver o in observers ) {
o.Update( this );
}
}

// 数を生成する
public abstract void Execute();
}
}


RandomNumberGeneratorクラス
using System;

namespace Gushwell.DesignPatterns {
public class RandomNumberGenerator : NumberGenerator {
private Random random = new Random(); // 乱数生成機
private int number; // 現在の数

// 数を取得する
public override int Number {
get { return number; }
}

public override void Execute() {
for ( int i = 0; i < 20; i++ ) {
number = random.Next( 50 );
NotifyObservers();
}
}
}
}


DigitObserverクラス
using System;
using System.Threading;

namespace Gushwell.DesignPatterns {

public class DigitObserver : IObserver {
public virtual void Update(NumberGenerator generator) {
Console.WriteLine( "DigitObserver:" + generator.Number );
Thread.Sleep( 100 );
}
}
}


GraphObserverクラス
using System;
using System.Threading;

namespace Gushwell.DesignPatterns {

public class GraphObserver : IObserver {
public virtual void Update(NumberGenerator generator) {
Console.Write( "GraphObserver:" );
int count = generator.Number;
for ( int i = 0; i < count; i++ ) {
Console.Write( "*" );
}
Console.WriteLine( "" );
Thread.Sleep( 100 );
}
}
}


Programクラス
using System;

namespace Gushwell.DesignPatterns {

public class Program {
public static void Main(string[] args) {
NumberGenerator generator = new RandomNumberGenerator();
IObserver observer1 = new DigitObserver();
IObserver observer2 = new GraphObserver();
generator.AddObserver( observer1 );
generator.AddObserver( observer2 );
generator.Execute();
}
}
}



 

この記事へのトラックバックURL