头部优先设计模式策略模式Python

2024-10-02 06:24:25 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我对战略设计模式的第一次尝试。在

我没有使用Python的体系结构经验,所以欢迎有建设性的意见。在

我把这个贴在Stack Over Flow上,因为今天早上我会发现它作为一个健全的检查是有用的。显然,我没有为这个线程(可怕的验证短语)提供足够的上下文,所以我只能像鸭子一样呱呱叫了。在

嘎嘎,嘎嘎,嘎嘎:-)

#!/usr/bin/env python

"""
    Head First Design Patterns - Strategy Pattern
    My attempt to implement the Strategy Pattern, described in Chapter 1.

    Sanity Warning:  I am currently learning Python, so please don't expect the
    exquisite design, planning, construction, and execution of the Curiosity mission.

    Expect Ducks... Quacking...

    Design Principle: "Favour composition over inheritance" 

    To the Pythonista community: What is the most elegant, readable, and simplest way
    of implementing the HFDP Strategy Pattern?
"""

import abc

"""

Abstract Base Classes

Duck > QuackBehaviour > FlyBehaviour

"""

class Duck(object):
    __metaclass__ = abc.ABCMeta

    def __init__(self):
        self.quackBehaviour = None;
        self.flyBehaviour = None;

    @abc.abstractmethod
    def display(self):
        pass

    def performQuack(self):
        self.quackBehaviour.quack()

    def performFly(self):
        self.flyBehaviour.fly()

    def swim(self):
        print "All ducks float, even decoys!"

class QuackBehaviour(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def quack(self):
        """All sub classes agree to quack"""
        pass

class FlyBehaviour(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def fly(self):
        """All sub classes agree to fly"""
        pass

"""

Sub class implementations

MallardDuck > Quack > MuteQuack > SqueakQuack > FlyWithWings > FlyNoWay > FlyRocketPowered

"""

class MallardDuck(Duck):
    def __init__(self):
        Duck.quackBehaviour = Quack()
        Duck.flyBehaviour = FlyWithWings()

    def display(self):
        print "I'm a real Mallard Duck"

class Quack(QuackBehaviour):
    def quack(self):
        print "Quack"

class MuteQuack(QuackBehaviour):
    def quack(self):
        print "<< Silence >>"

class SqueakQuack(QuackBehaviour):
    def quack(self):
        print "Squeak"

class FlyWithWings(FlyBehaviour):
    def fly(self):
        print "I'm flying!!"

class FlyNoWay(FlyBehaviour):
    def fly(self):
        print "I can't fly"

class FlyRocketPowered(FlyBehaviour):
    def fly(self):
        print "I'm flying with a rocket!"

"""

Cue Space Odyssey Opening...

"""

if __name__ == '__main__':
    mallard = MallardDuck()
    mallard.display()
    mallard.performQuack()
    mallard.performFly()
    mallard.flyBehaviour = FlyRocketPowered()
    mallard.performFly()

"""

Output:

I'm a real Mallard Duck
Quack
I'm flying!!
I'm flying with a rocket!

"""

Tags: theselfdefclassabcprintflyduck

热门问题