Python 中的“鸭子输入”也是一种“外观设计模式”吗?

问题描述

每当我们能够从不同的类中调用一个函数时,它是否被认为是 Facade 设计模式?

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

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

解决方法

立面通过单个接口提供抽象

你在这里没有抽象任何东西,只是定义了两个独立的实例方法,可以在任何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()可以定义为父类中的抽象函数)