2015-04-30 51 views
2

我有两个问题:首先,如何使用Python创建FlyBehavior interface?其次,如何使用Python(见下文)在FlyWithWings类中的FlyBehavior接口?我正在学习用深入浅出设计模式,我想用Python使用Python创建和实现接口?

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

这里改写以下的Java类的所有飞行的行为类实现

public interface FlyBehavior { 
    public void fly(); 
} 

这里的接口是飞行的行为实施为鸭子做飞

public class FlyWithWings implements FlyBehavior { 
    public void fly(){ 
    System.out.println("I'm flying"); 
    } 
} 

这是我迄今为止使用Python。下面是我的Python抽象鸭类

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 

这里是我被困在试图创建接口,并试图实现接口。

+1

什么是'abc'? – immibis

+0

@immibis抽象基类,我在这个链接阅读了这个:https://docs.python.org/2/library/abc.html – Sparky

回答

4

亚历克斯·泰勒指出,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" 
+0

不应该最后一行是:'d.performFly()'? – twk

+0

@twk固定..... – immibis

3

Python是duck typed语言。你不需要接口 - 你传入一个对象,并且它支持你想要的方法。如果它没有这种方法爆炸。它没有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() 

作为一个更广泛的观点,并不是所有的设计模式适用于所有语言。见Are Design Patterns Missing Language Features

+1

关于设计模式不适用于所有语言的好处。 – immibis