Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_0Number_7Number_5Number_1Number_2Number_5Number_5
インデント OCPとデザインパターン
インデント サンプルコードについて
インデント デザインパターン ひとくちメモ
インデント FactoryMethodパターン
インデント AbstractFactoryパターン
インデント Builderパターン
インデント Prototypeパターン
インデント Adapterパターン
インデント Bridgeパターン
インデント Compositeパターン
インデント Decoratorパターン
インデント Facadeパターン
インデント Flyweightパターン
インデント Proxyパターン
インデント TemplateMethodパターン
インデント Chain of Responsibilityパターン
インデント Commandパターン
インデント Iteratorパターン
インデント Mediatorパターン
インデント Mementoパターン
インデント Observerパターン
インデント Stateパターン
インデント Strategyパターン
インデント Visitorパターン
インデント 速習!デザインパターン第一回
インデント 速習!デザインパターン第二回
インデント 速習!デザインパターン第三回
インデント UMLとは
インデント UML入門
インデント オブジェクト指向
インデント クラス図
インデント アクティビティ図
インデント インタラクション図
インデント ユースケース図
インデント Rarestyle証明書サービス
インデント QRコード発行WSDL
インデント QRコード発行サンプル
インデント J2EE覚書
インデント FreeMind実践レポート
インデント モバイル情報
インデント Homeページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

Observerパターン (デザインパターン)

Observerパターン 導入

Observerパターンは、観測者と観測対象の関係を表現し、オブジェクトの状態変化を通知できるようにします。

一つの観測対象に対して、観測者は複数とれること、観測者には、観測対象が必要であること、観測対象は観測者のことを知らない、観測者は観測対象を知っていること(誘導可能性)などを考慮してして組み立てられます。

UML図をみると、具象化された観測対象と同じく具象化された観測者だけで処理することも考えられるとおもいます。しかし、具象観測対象がすべての具象観測者の情報を保持しているのは不自然なことであり、また具象観測対象から全ての具象観測者に通知する仕組みが必要であることを考えて、観測者を抽象化するの一般的です。

観測者を保持する機能を持ったクラスを抽象観測対象として設定し、またいかなる観測者も追加できるように基本的なインターフェース(更新通知メソッド Update)を含めて設定して観測者も抽象化します。

Observerパターン ポイント

抽象観測者と抽象観測対象の設置することで具象観測者と具象観測対象との関係が自然な形になる。

UML Observerパターン

C#ソースコード Observerパターン

Sample.cs

using System;
using System.Collections;

namespace Observer
{

   //------------------------------------------------------------------
   //  デザインパターン Observer
   //
   //  あるオブジェクトの状態が変わった時に、それに依存するすべての
   //  オブジェクトに自動的にそのことが知らされ更新されるように、
   //  オブジェクト間に一対多の依存関係を定義する
   //
   //------------------------------------------------------------------

   //Subject(観察対象の定義)
   public class Subject
   {
       ArrayList aryObserver =new ArrayList();

       //具象観測者を追加します。
       public void AddObserver(Observer observer)
       {
           aryObserver.Add(observer);
       }
       //具象観測者を削除します。
       public void RemoveObserver(Observer observer)
       {
           aryObserver.Remove(observer);
       }

       //全ての観測者のに対して通知をおこなう
       public void NotifyObserver()
       {
           foreach(Observer observer in aryObserver)
           {
               observer.Update();
           }
       }

       //変更を通知
       public void SetChanged()
       {
           NotifyObserver();
       }
   }

   //会社を定義します。
   public class ConcreteSubject_Company : Subject
   {
       //会社名を定義
       string strCompanyName;
       //社長を定義
       string strPresidentName;

       //会社コンストラクタ
       public ConcreteSubject_Company(string strCompanyName)
       {
           this.strCompanyName=strCompanyName;
       }
       //会社名
       public string GetState_CompanyName
       {
           set{this.strCompanyName=value;}
           get{return strCompanyName;}

       }
       //社長名
       public string GetState_PresidentName
       {
           set{this.strPresidentName=value;}
           get{return strPresidentName;}
       }
   }

   //Observerの抽象定義(インターフェース)
   public abstract class Observer
   {
       public abstract void Update();
   }

   //具象観測者の定義
   public class ConcreteObserver_Worker : Observer
   {
       string strWorkerName;
       ConcreteSubject_Company SubjectCompany;

       //具象観測者には、対象とするオブジェクト(具象観測対象)を登録します。
       public ConcreteObserver_Worker(ConcreteSubject_Company SubjectCompany,
                                       string strWorkerName)
       {
           this.strWorkerName=strWorkerName;
           this.SubjectCompany =SubjectCompany;
       }

       public string SyainName
       {
           set{this.strWorkerName=value;}
           get{return strWorkerName;}
       }

       public override void Update()
       {
           Console.WriteLine("私の名前は{0}です。{1}に勤務してます。社長の名前は{2}さんです。",
               this.strWorkerName,
               SubjectCompany.GetState_CompanyName,
               SubjectCompany.GetState_PresidentName);
       }
   }
   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
           //会社インスタンス生成
           ConcreteSubject_Company Company= new ConcreteSubject_Company("アニマルランド");

           //社長就任
           Company.GetState_PresidentName="ライオンキング";

           //社員採用
           Company.AddObserver(new ConcreteObserver_Worker(Company,"パンダ"));
           Company.AddObserver(new ConcreteObserver_Worker(Company,"うさぎ"));
           Company.AddObserver(new ConcreteObserver_Worker(Company,"コアラ"));
           Company.AddObserver(new ConcreteObserver_Worker(Company,"シマウマ"));

           //社員に通知
           Company.SetChanged();

           //社長交代(オブジェクトに変化あり)
           Company.GetState_PresidentName="空飛ぶダンボ";

           //社員に通知
           Company.SetChanged();
       }
   }
}

Observer 実行結果

Observer_fig

UMLプラグインによる描画 Observerパターン

Javaソースコード Observerパターン

Subject.java
   1: package observer;
   2: 
   3: import java.util.ArrayList;
   4: import java.util.Iterator;
   5: 
   6: public abstract class Subject {
   7: 
   8:     private ArrayList observers =new ArrayList();
   9: 
  10:     public void addObserver(Observer observer) {
  11:         this.observers.add(observer);
  12:     }
  13:     
  14:     public void removeObserver(Observer observer) {
  15:         this.observers.remove(observer);
  16:     }
  17: 
  18:     //全てのオブザーバーに通知
  19:     public void notifyObservers() {
  20:         Iterator itr =observers.iterator();
  21:         while(itr.hasNext()){
  22:             ((Observer)itr.next()).update();
  23:         }
  24:     }
  25: 
  26:     public void setChanged() {
  27:         this.notifyObservers();
  28:     }
  29: 
  30: }
Observer.java
   1: package observer;
   2: 
   3: public abstract class Observer {
   4: 
   5:     public abstract void update();
   6: 
   7: }
ConcreteSubject_Company.java
   1: package observer;
   2: 
   3: public class ConcreteSubject_Company extends Subject {
   4: 
   5:     private String CompanyName;
   6: 
   7:     private String President;
   8: 
   9:     
  10: 
  11:     public String getCompanyName() {
  12:         return CompanyName;
  13:     }
  14: 
  15:     public void setCompanyName(String CompanyName) {
  16:         this.CompanyName = CompanyName;
  17:     }
  18: 
  19:     public String getPresident() {
  20:         return President;
  21:     }
  22: 
  23:     public void setPresident(String President) {
  24:         this.President = President;
  25:     }
  26: 
  27:     public ConcreteSubject_Company(String companyName) {
  28:         //コンストラクタで社名はセット
  29:         this.CompanyName=companyName;
  30:     }
  31: }
  32:     
  33: 
  34:     
ConcreteObserver_Worker.java
   1: package observer;
   2: 
   3: public class ConcreteObserver_Worker extends Observer {
   4: 
   5:     private ConcreteSubject_Company concreteSubject_Company;
   6: 
   7:     private String WorkerName;
   8: 
   9:     public void update() {
  10:         
  11:         System.out.println("私の名前は"+ this.WorkerName + "といいます。"
  12:                         +this.concreteSubject_Company.getCompanyName()    + "に勤めています。"
  13:                         + "会社の社長は"+this.concreteSubject_Company.getPresident() 
  14:                         + "さんです。\n");
  15:         
  16:     }
  17: 
  18:     public ConcreteSubject_Company getConcreteSubject_Company() {
  19:         return concreteSubject_Company;
  20:     }
  21: 
  22:     public void setConcreteSubject_Company(ConcreteSubject_Company concreteSubject_Company) {
  23:         this.concreteSubject_Company = concreteSubject_Company;
  24:     }
  25: 
  26:     public String getWorkerName() {
  27:         return WorkerName;
  28:     }
  29: 
  30:     public void setWorkerName(String WorkerName) {
  31:         this.WorkerName = WorkerName;
  32:     }
  33: 
  34:     public ConcreteObserver_Worker(
  35:         ConcreteSubject_Company company,
  36:         String workerName) {
  37:             
  38:             //コンストラクタで会社と名前をセット
  39:             this.concreteSubject_Company=company;
  40:             this.WorkerName=workerName;
  41:     }
  42: 
  43: }
StartClass.java
   1: package observer;
   2: 
   3: public class StartClass {
   4: 
   5:     public static void main(String[] args) {
   6:         
   7:         //会社インスタンス作成
   8:         ConcreteSubject_Company company =new ConcreteSubject_Company("アニマルランド");
   9:         //社長
  10:         company.setPresident("ライオンキング");
  11:         //オブザーバーとして社員を考えます。
  12:         company.addObserver(new ConcreteObserver_Worker(company,"パンダ"));
  13:         company.addObserver(new ConcreteObserver_Worker(company,"うさぎ"));
  14:         company.addObserver(new ConcreteObserver_Worker(company,"コアラ"));
  15:         company.addObserver(new ConcreteObserver_Worker(company,"シマウマ"));
  16:         //オブザーバーに通知
  17:         company.setChanged();
  18:         
  19:         company.setPresident("空飛ぶダンボ");
  20:         //オブザーバーに通知
  21:         company.setChanged();
  22:     }
  23: }



コミュニティマーカーデザインパターン「ひとくちメモ」へ

コミュニティマーカーHomeへもどる

お天気情報
東京都 東京 - 今日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
東京都 東京 - 明日の天気
晴時々曇 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2010/09/03 17:00:00  ST: True
東京都 東京 - あさっての天気
曇時々晴 - リンク先
最高 最低
気温 34 27
湿度 93.2 80.6
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - 明日の天気
晴れ - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2010/09/04 5:00:00  ST: True
大阪府 大阪 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索