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()可以定义为父类中的抽象函数)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...