【问题标题】:Is 'duck typing' in Python also a 'Facade Design Pattern'?Python中的“鸭子打字”也是一种“外观设计模式”吗?
【发布时间】:2021-08-06 18:00:41
【问题描述】:

当我们能够从不同的类中调用一个函数时,它会被视为外观设计模式吗?

class Mobile:
    def __init__(self, name, ram, memory):
        self.name = name
        self.ram = ram
        self.memory = memory
    
    def info(self):
        return self.name, self.ram, self.memory
    
class Printer:
    def __init__(self, name, size, color):
        self.name = name
        self.size= size
        self.color= color
    
    def info(self):
        return self.name, self.size, self.color
    
    
mob = Mobile("Dark", 8, 128)        
prt = Printer("Alpine", '4-5', 'white')   

print(mob.info())
print(prt.info())

在上面的代码中,我们对两个类使用了相同的函数。这会被视为外观设计模式吗?

【问题讨论】:

  • 您能否阐明您认为这与 Facade 模式 鸭式打字有何关系?外观 wrapsabstractsbundles 其他代码,您的代码不会这样做。鸭子类型是多态的一种方式,您的代码也没有这样做。你刚刚复制了一个类,它的行为当然是一样的——不涉及外观,也不需要在这里输入鸭子。
  • 重复的类有必要不是完全不同的类吗?如果我们改变班级结构,你认为会发生什么变化?它仍然是另一个具有相同功能“信息”的类,无论如何 Duck 类型是与动态类型相关的概念,其中对象的类型或类不如它定义的方法重要。

标签: python class design-patterns facade


【解决方案1】:

外观通过单个接口提供抽象

你这里没有抽象任何东西,只是定义了两个独立的实例方法,可以用任何 OOP 语言完成,所以鸭子类型是无关紧要的

请注意,您的类完全相同,因此您不需要两个类,只需 两个实例 class Mobile

class Mobile:
    def __init__(self, name, ram, memory):
        self.name = name
        self.ram = ram
        self.memory = memory
    
    def info(self):
        return self.name, self.ram, self.memory    
    
    
mob1 = Mobile("Dark", 8, 128)        
mob2 = Mobile("Alpine", 16, 128) 

如果您定义了 abstract base class,那么您将使用继承与子类,但仍然不是外观

在您的情况下,Façade 的一个示例是某些运营商将呼叫/消息(通过单个界面)路由到任何“移动设备”,其中移动设备可能有完全不同的联系方式(contact() 可能是定义为父类中的抽象函数)

【讨论】:

  • 我认为无论您给出的输入是正确的,但是,您过于关注类而不是设计本身,Facade 基本上是为复杂的子系统生成一个简单的接口,它可以是抽象的、捆绑的或精简的。抽象工厂模式也是门面设计模式。现在我的问题是,因为 Duck Typing 是一些如何为不同类的多个方法制作简单接口的方法。你会认为这是一种外观设计模式吗?
  • 作为回答,鸭子打字与问题无关。多个(不相关的)类共享相同的方法签名不是外观,并且可以在没有鸭子类型的情况下完成。外观最重要的方面是它隐藏的“底层、复杂的子系统”,而不是用于访问它的方法/对象。这里有一个例子——外观本身是更高级别的类sourcemaking.com/design_patterns/facade/python/1跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 2011-05-11
  • 2019-12-23
相关资源
最近更新 更多