Spa*_*rky 3 java design-patterns python-2.7
我有两(2)个问题:首先,如何interface使用Python 创建FlyBehavior ?其次,如何implement使用Python在FlyWithWings类中的FlyBehavior接口(请参见下文)?我正在从头开始学习设计模式,并且想使用Python重写以下Java类
public abstract class Duck {
// Reference variables for the
// behavior interface types
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
// Delegate to the behavior class
public void performFly(){
flyBehavior.fly();
}
// Delegate to the behavior class
public void performQuack(){
quackBehavior.quack();
}
}
Run Code Online (Sandbox Code Playgroud)
这是所有飞行行为类实现的接口
public interface FlyBehavior {
public void fly();
}
Run Code Online (Sandbox Code Playgroud)
这是做鸭子飞行行为的实现
public class FlyWithWings implements FlyBehavior {
public void fly(){
System.out.println("I'm flying");
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我使用Python所拥有的。以下是我的Python抽象Duck类
import abc
class Duck:
__metaclass__=abc.ABCMeta
FlyBehavior FlyBehavior;
QuackBehavior QuackBehavior;
@abc.abstractmethod
def __init__():
return
@abc.abstractmethod
def performFly():
return
@abc.abstractmethod
def performQuack():
return
Run Code Online (Sandbox Code Playgroud)
这是我在尝试创建接口并尝试实现接口时遇到的问题。
Python 是一种鸭子类型语言。您不需要接口 - 您传入一个对象,如果它支持您想要的方法,它就可以工作。如果没有这个方法,它就会爆炸。它没有 Java 那样的编译时检查。如果您需要检查,您可以在运行时自行执行。所以它应该只是:
import abc
class Duck:
__metaclass__=abc.ABCMeta
FlyBehavior FlyBehavior;
QuackBehavior QuackBehavior;
@abc.abstractmethod
def __init__():
return
@abc.abstractmethod
def performFly():
flyBehavior.fly()
@abc.abstractmethod
def performQuack():
quackBehavior.quack()
Run Code Online (Sandbox Code Playgroud)
从更广泛的角度来看,并非所有设计模式都适用于所有语言。请参阅设计模式是否缺少语言功能。
正如Alex Taylor所指出的那样,Python是一种鸭子式语言-您无需指定事物的类型,只需使用它们即可。
但是,我认为他对Java代码的翻译是错误的。您无需在abc这里使用-只需使用普通的类即可。
class Duck(object):
# Like in Java, you don't need to write a __init__ if it's empty
# You don't need to declare fields either - just use them.
def performFly(self):
self.flyBehaviour.fly()
def performQuack(self):
self.quackBehaviour.quack()
class FlyWithWings(object):
def fly(self):
print "I'm flying"
# Example:
d = Duck()
d.flyBehaviour = FlyWithWings()
d.performFly() # prints "I'm flying"
Run Code Online (Sandbox Code Playgroud)