Adapterパターン
30分プログラム、その254。AdapterパターンをPythonで。
id:rednesがid:rednes:20080227でAdapterパターンを書いていたので、マネしてみる。
pythonでは抽象メソッドを定義出来ないんで、抽象メソッドの役割を持たせたかったら例外を投げるようにします。
pythonでのJavaで言うインターフェイスにあたる物はよくわからなかったんで、多重継承させる事にしました。
PythonだとJavaのようなインタフェースは不要だと思うんだ。インタフェースの利点は、そのインタフェースにキャストしても定義したメソッドを呼べる、ということだと思ってる。でも、PythonやRubyなどの動的型付け言語だと、キャストなどはないから、そもそも必要ないと考えている。それに、存在しないメソッドを呼んだら例外投げられるじゃん。
あと、移譲は引数が変わらないなら関数の代入で十分だと思う。
# def printStrong(self): # self.banner.showWithAster() self.printStrong = self.banner.showWithAster
使い方
>>> p = PrintBanner('mzp') >>> p.printWeak() (mzp) >>> p.printStrong() *mzp*
ソースコード
#! /usr/bin/python # -*- mode:python; coding:utf-8 -*- # # adapter.py - # # Copyright(C) 2008 by mzp # Author: MIZUNO Hiroki / mzpppp at gmail dot com # http://howdyworld.org # # Timestamp: 2008/02/28 21:59:44 # # This program is free software; you can redistribute it and/or # modify it under MIT Lincence. # # Bannerは同じ class Banner: def __init__(self,string): self.string = string def showWithParen(self): self.__showWith('(',')') def showWithAster(self): self.__showWith('*','*') def __showWith(self,begin,end): print begin+self.string+end class PrintBanner: def __init__(self,s): banner = Banner(s) self.printWeak = banner.showWithParen self.printStrong = banner.showWithAster