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*