Python デザインパターン サンプルコード Bridge
結城 浩「Java言語で学ぶデザインパターン入門」をPython化
Python3(3.11)で動くソースコード(.pyファイル .ipynbファイル)あります
「anaconda3」on .py「PyCharm」.ipynb「Jupyter Notebook」
(2023-11-18)Python3.11で動作確認済み
Display DisplayImpl (open, print, close, display) (rawOpen, rawPrint, rawClose) ↑ ↑ CountDisplay StringDisplayImpl (multiDisplay) (rawOpen, rawPrint, rawClose, printLine)class Display は,機能側の上位クラスです。
def main(): d1 = Display(StringDisplayImpl("Hello, Japan.")) d2 = Display(StringDisplayImpl("Hello, World.")) d3 = CountDisplay(StringDisplayImpl("Hello, Universe.")) d1.display() d2.display() d3.display() d3.multiDisplay(5) if __name__=='__main__': main() """標準出力 +-------------+ |Hello, Japan.| +-------------+ +-------------+ |Hello, World.| +-------------+ +----------------+ |Hello, Universe.| +----------------+ +----------------+ |Hello, Universe.| |Hello, Universe.| |Hello, Universe.| |Hello, Universe.| |Hello, Universe.| +----------------+ """
d1 = CountDisplay(StringDisplayImpl("Hello, Japan.")) d2 = CountDisplay(StringDisplayImpl("Hello, World.")) d3 = CountDisplay(StringDisplayImpl("Hello, Universe."))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys from abc import ABCMeta, abstractmethod class Display(object): def __init__(self, impl): self.impl = impl def open(self): self.impl.rawOpen() def print(self): self.impl.rawPrint() def close(self): self.impl.rawClose() def display(self): self.open() self.print() self.close() class CountDisplay(Display): def __init__(self, impl): super(CountDisplay, self).__init__(impl) def multiDisplay(self, times): self.open() for i in range(times): self.print() self.close() class DisplayImpl(metaclass = ABCMeta): @abstractmethod def rawOpen(self): pass @abstractmethod def rawPrint(self): pass @abstractmethod def rawClose(self): pass class StringDisplayImpl(DisplayImpl): def __init__(self, string): self.string = string self.width = len(string) def rawOpen(self): self.printLine() def rawPrint(self): sys.stdout.write("|{0}|\n".format(self.string)) def rawClose(self): self.printLine() def printLine(self): sys.stdout.write("+{0}+\n".format("-"*self.width)) def main(): d1 = Display(StringDisplayImpl("Hello, Japan.")) d2 = Display(StringDisplayImpl("Hello, World.")) d3 = CountDisplay(StringDisplayImpl("Hello, Universe.")) d1.display() d2.display() d3.display() d3.multiDisplay(5) if __name__=='__main__': main() """標準出力 +-------------+ |Hello, Japan.| +-------------+ +-------------+ |Hello, World.| +-------------+ +----------------+ |Hello, Universe.| +----------------+ +----------------+ |Hello, Universe.| |Hello, Universe.| |Hello, Universe.| |Hello, Universe.| |Hello, Universe.| +----------------+ """