|
Rarestyleへようこそ
|
|
|
|
|
|
デザインパターンでキャリアアップ
|
Observerパターン (デザインパターン)
Observerパターン 導入
Observerパターンは、観測者と観測対象の関係を表現し、オブジェクトの状態変化を通知できるようにします。
一つの観測対象に対して、観測者は複数とれること、観測者には、観測対象が必要であること、観測対象は観測者のことを知らない、観測者は観測対象を知っていること(誘導可能性)などを考慮してして組み立てられます。
UML図をみると、具象化された観測対象と同じく具象化された観測者だけで処理することも考えられるとおもいます。しかし、具象観測対象がすべての具象観測者の情報を保持しているのは不自然なことであり、また具象観測対象から全ての具象観測者に通知する仕組みが必要であることを考えて、観測者を抽象化するの一般的です。
観測者を保持する機能を持ったクラスを抽象観測対象として設定し、またいかなる観測者も追加できるように基本的なインターフェース(更新通知メソッド Update)を含めて設定して観測者も抽象化します。
Observerパターン ポイント
抽象観測者と抽象観測対象の設置することで具象観測者と具象観測対象との関係が自然な形になる。
UML Observerパターン
C#ソースコード Observerパターン
|
Sample.cs
|
|
using System;
using System.Collections;
namespace Observer
{
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;}
}
}
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);
}
}
class Class1
{
[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 実行結果
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サービスより提供 |
|
【工事中】お天気配信 ユーザー登録 |
|
|
|
|
|
Internet Explorer5.0以上のご利用を推奨いたします。
|
 |
Copyright 2006 Rarestyle
このページへのリンクは確認不要です。
Programming by Xenon Project Team
postmaster@rarestyle.net
免責事項について
|