Adapterパターン

結城浩さんの「Java言語で学ぶデザインパターン入門」を題材にpythonデザインパターン
書いてみる。
今回はAdapterパターンがテーマで、与えられた文字列を(Hello)のように表示したり、*Hello*のように表示するプログラム。
クラスによるパターン(継承を使う)とインスタンスによるパターン(委譲を使う)が
示されている。
まずは継承を使ったパターン(adapterk.py)から。
最初はBannerクラス

class Banner(object):
    def __init__(self, word):
        self.word = word

    def showWithParen(self):
        print "(%s)" %(self.word)

    def showWithAster(self):
        print "*%s*" %(self.word)

ここでは文字列をカッコに入れて表示するshowWithParenメソッドと文字列の前後に*を付けて表示する
showWithAsterメソッドをつくる。
つづいてPrintingクラス

class Printing(object):
    def printWeak(self):
        pass

    def printStrong(self):
        pass

ここではprintWeakメソッドと printStrongメソッドを宣言してるだけ。
ここは元はインターフェースなのでpythonだと意味がないのだが、練習なので。
次はPrintBannerクラスのインスタンスを呼んでメソッドを実行
ここがBannerクラスを使ってPrintingクラスを満たすアダプターの役割を果たすことになる。

class PrintBanner(Banner):
    def __init__(self, word):
        super(PrintBanner, self).__init__(word)

    def printWeak(self):
        self.showWithParen()

    def printStrong(self):
        self.showWithAster()

ここではBannerクラスを継承して、Printingクラスを実装している。
super関数でBannerクラスのインスタンスを呼んで__init__(word)メソッドを使う部分は
pythonの継承では無くても大丈夫みたいだけど、練習としてそのまま使ってみた。
後はprintWeakメソッドとprintStrongメソッドを実装してやる。
最後にPrintBannerクラスのインスタンスを呼んでメソッドを実行。

p = PrintBanner("Hello")
p.printWeak()
p.printStrong()

実行結果は以下となる。

C:\works\python\book1>python adapterk.py
(Hello)
*Hello*

今度は委譲を使ったパターン(adapteri.py)。
BannerクラスとPrintingクラスに最後のPrintBannerクラスのインスタンスを呼んでメソッドを実行
する部分はそのまま。
異なるのはPrintBannerクラス。

class PrintBanner(Printing):
    def __init__(self, word):
        self.banner = Banner(word)

    def printWeak(self):
        self.banner.showWithParen()

    def printStrong(self):
        self.banner.showWithAster()

今度はPrintingクラスを継承して、まずBannerクラスのインスタンスを呼んでいる。
それで呼んだインスタンスに対してshowWithParenメソッドとshowWithAsterメソッドを
使うことによりprintWeakメソッドとprintStrongメソッドを実装している。
最終的に実行すると。

C:\works\python\book1>python adapteri.py
(Hello)
*Hello*