2010年11月12日金曜日

第2章 Adapterパターン : 一皮かぶせて再利用



早速一日サボってしまった…めげずに頑張ろう。

今回はAdapterパターン。自分の理解を書くとこんなところです。

  • 実際に動作する既存クラスに新しいインターフェイスを適用する場合に使う
  • Adapterは新しいインターフェイスにどの既存インターフェイスを当てるかを書くだけで、ここに具体的なロジックは実装しない
著書では二つの手法が紹介されています。私感としてはこんなところです。
  • 継承…AdapterがAdapteeとほぼ同じ感じであれば使う
  • 委譲…AdapterとAdapteeが微妙に違っていたり、複数のAdapteeがいたりしたら使う
曖昧な日本語だね☆

で、前回同様pythonによるコーディングをしてみた。内容は本と全く同じ。出来れば自分で別の例を試したいのだけど、例が思い浮かばないんです。

実行結果
(Hello)
*Hello*
(World)
*World*
ソースコード
#!/usr/bin/env python

class Banner:
    def __init__(self, string=""): self.string = string
    def showWithParen(self): print "(%s)" % self.string
    def showWithAster(self): print "*%s*" % self.string

# Interface
class __Print:
    def __init__(self): raise Exception("this is an interface!")
    def printWeak(self): raise NotImplementedError
    def printStrong(self): raise NotImplementedError

# Class
class Print:
    def printWeak(self): raise NotImplementedError
    def printStrong(self): raise NotImplementedError

# Case by interface - inheritance
class PrintBanner1(Banner, __Print):
    #def __init__(self, string): super(PrintBanner1, self).__init__(string)
    def printWeak(self): self.showWithParen()
    def printStrong(self): self.showWithAster()

# Case by class - delegation
class PrintBanner2(Print):
    def __init__(self, string): self.banner = Banner(string)
    def printWeak(self): self.banner.showWithParen()
    def printStrong(self): self.banner.showWithAster()


def main():
    pb1 = PrintBanner1("Hello")
    pb1.printWeak()
    pb1.printStrong()

    pb2 = PrintBanner2("World")
    pb2.printWeak()
    pb2.printStrong()

if __name__=='__main__': main()
PS.
一箇所コメントアウトしてあるところは、コンストラクタ内で明示的にスーパークラスのコンストラクタを呼んでいるのですが、このコメントアウトを外すと次のようなコンパイルエラーが出ます。原因は…分かりませんでした。
TypeError: super() argument 1 must be type, not classobj

0 件のコメント:

コメントを投稿