JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > デザインパターン > Observerパターン  
メニュー
Home
情報交換掲示板
Factory Method
Abstract Factory
Builder
Prototype
Singleton
Adapter
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Chain Of Responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy
Template Method
Visitor
  2003/07/25  田中宏和
Observerパターン
◆概要
あるオブジェクトの状態が変わった時に、それに依存するすべてのオブジェクトに自動的にそのことが知らされ更新されるように、オブジェクト間に一対多の依存関係を定義する
◆UML
◆ここでの環境
OS Windows XP
J2SE SDK 1.4.1_01
◆概念的なソースコード
Subject.java(ここからダウンロード)
import java.util.*;

abstract class Subject {
  private ArrayList observers = new ArrayList();

  public void attatch(Observer observer) {
    observers.add(observer);
  }

  public void detatch(Observer observer) {
    observers.remove(observer);
  }

  public void notifyObservers() {
    for (int i=0;i<observers.size();i++) {
      Observer observer = (Observer)observers.get(i);
      observer.update();
    }
  }
}
ConcreteSubject.java(ここからダウンロード)
public class ConcreteSubject extends Subject {
  private String subjectState;

  public String getSubjectState() {
    return subjectState;
  }
  public void setSubjectState(String subjectState) {
    this.subjectState = subjectState;
  }
}
Observer.java(ここからダウンロード)
abstract class Observer {
  abstract public void update();
}
ConcreteObserver.java(ここからダウンロード)
public class ConcreteObserver extends Observer{
  private String name;
  private String observerState;
  private ConcreteSubject subject;

  public ConcreteObserver(ConcreteSubject subject , String name) {
    this.subject = subject;
    this.name = name;
  }

  public void update() {
    observerState = subject.getSubjectState();
    System.out.println("Observer " + name + "が新しい状態になりました");
  }


  public ConcreteSubject getSubject() {
    return subject;
  }
  public void setSubject(ConcreteSubject subject) {
    this.subject = subject;
  }
}
Client.java(ここからダウンロード)
public class Client {
  public static void main(String[] args) {
    ConcreteSubject s = new ConcreteSubject();
    s.attatch(new ConcreteObserver(s , "Observer1"));
    s.attatch(new ConcreteObserver(s , "Observer2"));
    s.attatch(new ConcreteObserver(s , "Observer3"));
    s.attatch(new ConcreteObserver(s , "Observer4"));

    s.setSubjectState("NEW");
    s.notifyObservers();
  }
}
 
◆実行
コマンドプロンプト
C:\JavaHello\Observer>javac *.java

C:\JavaHello\Observer>java Client
Observer Observer1が新しい状態になりました
Observer Observer2が新しい状態になりました
Observer Observer3が新しい状態になりました
Observer Observer4が新しい状態になりました

C:\JavaHello\Observer>

おおおお!実行できましたね!

 
 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME