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()