何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

Pythonで頑張る『Java言語で学ぶデザインパターン入門』【Template Methodパターン】

【前回までの粗筋】
財布からお金が消えた。専門書は高い。

今日はTemplate Methodである。Javaでいう抽象クラスとインタフェースは何が違うのかが理解できていない気がしてきた。
インタフェースの場合はクラスの親子関係から離れて実装できるのだろうか…。

そして以下のコードはPythonである。そもそもJavaの考えをPythonに持ち込む必要があるのだろうか…どれが言語固有の概念でどれがオブジェクト指向プログラミングの概念なのか。

"""Template Method
1つのオペレーションにアルゴリズムの骨格を定義しておき、
その中のいくつかの部分についてはサブクラスでの定義に任せる。
アルゴリズムの構造を変えずにアルゴリズム内のあるステップを
サブクラスで再定義する。
"""

import abc

class AbstructDisplay(metaclass=abc.ABCMeta):
    """Abstruct Class
    アルゴリズムの不変部分はここで実装しておく"""
    @abc.abstractmethod
    def start(self):
        pass
    @abc.abstractmethod
    def output(self):
        pass
    @abc.abstractmethod
    def end(self):
        pass
    def display(self):
        self.start()
        for i in range(5):
            self.output()
        self.end()

class CharDisplay(AbstructDisplay):
    """Concrete Class
    具体的な動きを実装する"""
    def __init__(self, ch):
        self.__ch = ch
    def start(self):
        print('<<', end="")
    def output(self):
        print(self.__ch, end="")
    def end(self):
        print('>>', end="\n")

class StringDisplay(AbstructDisplay):
    """Alternative Concrete Class
    もう一つの具象サブクラス"""
    def __init__(self, string):
        self.__string = string
    def start(self):
        self.__printline()
    def output(self):
        print('|' + self.__string + '|')
    def end(self):
        self.__printline()
    def __printline(self):
        print('+', end="")
        print('-' * len(self.__string), end="")
        print('+', end="\n")
    

def main():
    """テスト函数"""
    c = CharDisplay('Ni!')
    c.display()
    s = StringDisplay('And now for something completely different')
    s.display()
    
if __name__ == '__main__':
    main()