Adapter pattern in Python

Java言語で学ぶデザインパターン入門第3版』が出ていたので買ってみた。

有名な本だけど、(増補改訂版は)古いし Java 詳しくないしで手を出していなかったんだけど、リニューアルされたんじゃあ買うしかない。

著者のページ → https://www.hyuki.com/dp/

というわけで、Python で第2章の adapter パターンを実装してみた。

from abc import ABCMeta, abstractmethod


# 100VのAC電源、adaptee
class Banner:
    def __init__(self, string: str) -> None:
        self.string = string

    def show_with_paren(self) -> None:
        print(f"({self.string})")

    def show_with_aster(self) -> None:
        print(f"*{self.string}*")


# DC 12V で動くノートパソコン、target
class Print(metaclass=ABCMeta):
    @abstractmethod
    def print_weak(self) -> None:
        pass

    @abstractmethod
    def print_strong(self) -> None:
        pass


# adapter
class PrintBanner(Print):
    def __init__(self, string: str) -> None:
        self.banner = Banner(string)

    def print_weak(self) -> None:
        self.banner.show_with_paren()

    def print_strong(self) -> None:
        self.banner.show_with_aster()


def main() -> None:
    p = PrintBanner("Hello")
    p.print_weak()
    p.print_strong()


if __name__ == "__main__":
    main()

特に難しいところはなく、ABCMeta とかあったなーという感想。

p は元コードでは Print 型の変数になってるけど、Python だとめんどくさそう(というかこのままの方がよさそう?)なので PrintBanner のまま。

コメント

タイトルとURLをコピーしました