DP/ INTRO

■Overview
Composite for
オブジェクトが木構造で現れる場合
Proxy for
あるオブジェクトへの多機能で精巧な参照が必要な場合
Prototype for
オブジェクトの生成方法がシステムから独立している場合
Singleton for
あるクラスに対してインスタンスが1つしか存在しないことを保証したい場合
Adapter for
既存のクラスを利用したいがそのIFが必要なIFと一致していない場合
Multicast for
特定のオブジェクトが他のオブジェクトの情報を受け取り その情報を型安全なオブジェクトにカプセル化して転送する場合

Composite
Component, Composite, Leaf

ファイルシステム
要素はFileとDirectory
Directoryの子要素にはDirectory自身を持つこともFileを持つことも可
つまり
木構造

オブジェクト間の関連が木構造となる場合
Compositeパターンが適応できる


Proxy
Subject, Proxy, RealSubject

ファイルシステムにシンボリックリンク機能を追加

※シンボリックリンク:
 FileやDirectoryの実体が存在する場所を
 データとして保持し、実体のように振舞う機能

実体の代理として働くシンボリックリンクは
実体とは異なった場所で定義できたり
実体とは別のアクセス券を定義できたりできる
Windowsでゆうショートカット

代理の働きを行うもの(ショートカットリンク)の作成に Proxyパターンが適応できる

Proxyパターンは
実際のオブジェクトに対して
それを参照している代理 をたて
クライアントに対してその代理によって
あたかも実際にオブジェクトにアクセスしてるかのように見せられる

Prototype
Prototype, ConcretePrototype

FileやDirectoryのコピー
Fileは
Fileのデータ部分をコピーし
Directoryは
Directoryの子要素をコピーする

newFile.setValue(origiralFile.getValue());
的処理の繰り返しでコピーできるが
newFile newDirectory newLinkのいずれを新規用意すべきか
の判定処理が随所に入る上
コピー先で入れ子関係を記憶して行く必要がある

といったケースにPrototypeパターンが適応できる

Prototypeパターンは
プロトタイプ(原型)をコピーすることで
新たなオブジェクトを生成する

うーもう一歩。

Singleton
Singleton

あるクラスのインスタンスがひとつしか存在しないことを保証し
それにアクセスするためのグローバルな方法を提供する

public class Singleton {
  private static Singleton instance;
  public static getInstance() {
    if (instance == null) {
      instance == new Singleton();
    }
    return instance;
  }
  private Singleton() { }
}

な具合

Adapter
Target, Adapter, Adaptee

あるクラスのIFを
クライアントが求める別のIFへ変換できる

public class Adapter extends Adaptee implements Target {
  public viod request() {
    specificRequest(); // Adaptee のメソッドを呼ぶ.
  }
}

TargetをimplしていないAdapteeのメソッドを呼びたいが
Targetをimplしてないといけん時に
AdaterにTargetをimplさせて
Adapter内でAdaptee内のメソッドを呼べばよい

SwingのJTreeとTreeModelは
SpringMVCのViewとModelにあたる
javax.swing.tree.TreeModelを実装したものを
SpringMVCのModelに合わせる必要が生じた場合
等にAdapterが適応できる

MulticastObserver
Source, Listener, ConcreteListener, Event

Observerパターンでは
Subjectが更新されるとObserverのupdate()が呼ばれる
Observerがこの時に更新された情報を得るための方法にpull型とpush型がある

pull型では
ConcreteObserverはConcreteSubjectを直接知っているので
updateの際にConcreteSubjectに更新内容を酔い合わせる

push型では
ConcreteSubjectが
変更を通知するnotify()を行う際に詰め込む変更内容保持Objectを
ConcreteObserverに転送する

push型のメリットは
ConcreteObserverがConcreteSubjectを知らなくてもヨイところ
つまり
依存度が低いところ

しかし、
java.util.Observerのupdate()メソッドの引数から分かるように
Observer側では
Objectクラスを受け取るために型安全が保証されない

Multicastパターンは
push型Observerパターンの型安全版である

Multicastでは
更新内容をEventクラスに含めて転送する
※Eventを利用することからイベントモデルとも言われる

Javaでは
Multicastパターンが非常に多く利用されており
多くのEventの種類がある
それらEventはjava.util.EventObjectクラスを継承している



ref:
http://www.objectclub.jp/technicaldoc/pattern/DPforJavaProgrammers

tag : Multicast Observer Adapter Singleton Prototype Proxy Composite

2009-06-13 12:24 : designpattern : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud