Pythonでのポリシーモード

3010 ワード

ポリシー・モードの学習と記録
  • 設計原則
  • アプリケーションで変更する必要がある可能性のある点を見つけて、彼らを独立させ、変更する必要のないコードと混同しないでください.
  • は、実装プログラミング
  • ではなく、インタフェースに対してプログラミングされる.

    クラスの実装にコードを引っ張られないでください.インタフェースのプログラミングの鍵は、マルチステート実行を利用すると状況に応じて本当の動作を実行することです.
    コード実装は次のとおりです.
    
    import abc
    
    
    class FlyBehavior:
        """ pass """
        __metaclass__ = abc.ABCMeta
    
        @classmethod
        @abc.abstractmethod
        def fly(cls):
            """ pass """
    
    
    class FlyWithWings(FlyBehavior):
        """ pass """
        @classmethod
        def fly(cls):
            """ pass """
            print('I can fly')
    
    
    class FlyNoWay(FlyBehavior):
        """ pass """
        @classmethod
        def fly(cls):
            """ pass """
    
    
    class QuackBehavior:
        """ pass """
        __metaclass__ = abc.ABCMeta
    
        @classmethod
        @abc.abstractmethod
        def quack(cls):
            """ pass """
    
    
    class Quack(QuackBehavior):
        """ pass """
        @classmethod
        def quack(cls):
            """ pass """
            print('I can quack ... gua gua gua !')
    
    
    class Squeak(QuackBehavior):
        """ pass """
        @classmethod
        def quack(cls):
            """ pass """
            print('I can quack ... zhi zhi zhi !')
    
    
    class QuackNotWay(QuackBehavior):
        """ pass """
        @classmethod
        def quack(cls):
            """ pass """
    
    
    class Duck:
        """ pass """
        def __init__(self, _fly, _quack):
            """ pass """
            self.__quack = _quack()
            self.__fly = _fly()
    
        def swim(self):
            """ pass """
            print('swiming ...!')
    
        def display(self):
            """ pass """
            self.__quack.quack()
            self.__fly.fly()
            self.swim()
    
    
    class MallardDuck(Duck):
        """ pass """
        def __init__(self, _fly, _quack):
            """ pass """
            print('MallardDuck')
            super(MallardDuck, self).__init__(_fly, _quack)
    
    
    class RubberDuck(Duck):
        """     """
        def __init__(self, _fly, _quack):
            """ pass """
            print('RubberDuck')
            super(RubberDuck, self).__init__(_fly, _quack)
    
    
    class DecoyDuck(Duck):
        """     """
        def __init__(self, _fly, _quack):
            """ pass """
            print('DecoyDuck')
            super(DecoyDuck, self).__init__(_fly, _quack)
    
    if __name__ == '__main__':
        mallar = MallardDuck(FlyWithWings, Quack)
        mallar.display()
        rubber = RubberDuck(FlyNoWay, Squeak)
        rubber.display()
        decoy = DecoyDuck(FlyNoWay, QuackNotWay)
        decoy.display()