Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-11-29

CLとデザインパターン - Adapter

| 01:35 | CLとデザインパターン - Adapter - わだばLisperになる を含むブックマーク はてなブックマーク - CLとデザインパターン - Adapter - わだばLisperになる

今回はAdapterパターンです。

体系の違うものをアダプタを介し、アダプタで差異を吸収することによって統一的に扱えるようにするパターンのようです。変換コネクタとかそういう感じでしょうか。

no titleの社長と社員の給与体系の違いを扱う方法が分かりやすかったのでこの例を元にしました。

Adapterにはクラスを継承するパターンと、委譲を使うパターンがあるようなのですが、総称関数ベースだとどちらとも微妙に違う感じになってしまいます。今回の例で言えば、shachoクラスに特定化したget-kyuyoを書いてしまえば、そもそもアダプタは不要になってしまうのですが、とりあえず例に沿ってみました。

(defclass shain () 
  ((jikyu :initform 0 :initarg :jikyu :accessor get-jikyu)
   (jikan :initform 0 :initarg :jikan :accessor get-jikan))
  (:documentation "時給と時間を保持"))

(defgeneric get-kyuyo (class)
  (:method ((class shain))
    (* (get-jikyu class)
       (get-jikan class)))
  (:documentation "時給x時間で給与を計算する"))

;; 動作
(get-kyuyo (make-instance 'shain :jikyu 1000 :jikan 140))
;=> 140000
;; 給与体系が、時給x時間ではなく固定給な社長を扱う必要性がでた。
(defclass shacho () 
  ((koteikyu :initform 0 :initarg :koteikyu :accessor get-koteikyu))
  (:documentation "固定給を保持"))

;; Adapterを作成(shainとshachoを継承)
(defclass shacho-adapter (shain shacho) 
  ()
  (:documentation "時給x時間で計算するget-kyuyoのためのアダプタ"))

;; 固定給(時給) x 1(時間)と見立てることで、get-kyuyoに適合させる
(defmethod get-jikyu ((class shacho-adapter))
  (get-koteikyu class))

(defmethod get-jikan ((class shacho-adapter))
  1)

(get-kyuyo (make-instance 'shacho-adapter :koteikyu 200000))
;=> 200000
;; get-kyuyoは変更しなくて済んだ。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20081129