Adapterパターン

30分プログラム、その254。AdapterパターンをPythonで。
id:rednesid:rednes:20080227でAdapterパターンを書いていたので、マネしてみる。

pythonでは抽象メソッドを定義出来ないんで、抽象メソッドの役割を持たせたかったら例外を投げるようにします。
pythonでのJavaで言うインターフェイスにあたる物はよくわからなかったんで、多重継承させる事にしました。

PythonだとJavaのようなインタフェースは不要だと思うんだ。インタフェースの利点は、そのインタフェースにキャストしても定義したメソッドを呼べる、ということだと思ってる。でも、PythonRubyなどの動的型付け言語だと、キャストなどはないから、そもそも必要ないと考えている。それに、存在しないメソッドを呼んだら例外投げられるじゃん。

あと、移譲は引数が変わらないなら関数の代入で十分だと思う。

# 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