📜  适配器方法 - Python设计模式

📅  最后修改于: 2022-05-13 01:55:45.885000             🧑  作者: Mango

适配器方法 - Python设计模式

适配器方法是一种结构设计模式,它帮助我们使不兼容的对象相互适应。 Adapter 方法是最容易理解的方法之一,因为我们有很多现实生活中的例子来显示它的类比。此方法的主要目的是在两个不兼容的接口之间建立一座桥梁。此方法为类提供不同的接口。通过考虑电缆适配器,我们可以更容易地理解这个概念,它允许我们在具有不同形状插座的地方为手机充电。
利用这个思想,我们可以集成由于接口不兼容而无法集成的类。

不使用适配器方法的问题

想象一下,您正在创建一个应用程序来显示所有不同类型车辆的数据。它以 XML 格式从不同车辆组织的 API 中获取数据,然后显示信息。
但是假设在某个时候您想使用机器学习算法升级您的应用程序,该算法可以很好地处理数据并仅获取重要数据。但是有一个问题,它只需要 JSON 格式的数据。
在机器学习算法中进行更改以获取 XML 格式的数据将是一种非常糟糕的方法。

问题适配器方法

问题适配器方法

使用适配器方法的解决方案

为了解决我们上面定义的问题,我们可以使用通过创建适配器对象来帮助的适配器方法
在我们的代码中使用适配器:

  1. 客户端应该通过使用目标接口调用适配器上的方法来向适配器发出请求。
  2. 使用 Adaptee 接口,适配器应该在适配器上转换该请求。
  3. 客户端收到呼叫结果,并且他/她不知道适配器的存在。
# Dog - Cycle
# human - Truck
# car - Car
  
class MotorCycle:
  
    """Class for MotorCycle"""
  
    def __init__(self):
        self.name = "MotorCycle"
  
    def TwoWheeler(self):
        return "TwoWheeler"
  
  
class Truck:
  
    """Class for Truck"""
  
    def __init__(self):
        self.name = "Truck"
  
    def EightWheeler(self):
        return "EightWheeler"
  
  
class Car:
  
    """Class for Car"""
  
    def __init__(self):
        self.name = "Car"
  
    def FourWheeler(self):
        return "FourWheeler"
  
class Adapter:
    """
    Adapts an object by replacing methods.
    Usage:
    motorCycle = MotorCycle()
    motorCycle = Adapter(motorCycle, wheels = motorCycle.TwoWheeler)
    """
  
    def __init__(self, obj, **adapted_methods):
        """We set the adapted methods in the object's dict"""
        self.obj = obj
        self.__dict__.update(adapted_methods)
  
    def __getattr__(self, attr):
        """All non-adapted calls are passed to the object"""
        return getattr(self.obj, attr)
  
    def original_dict(self):
        """Print original object dict"""
        return self.obj.__dict__
  
  
""" main method """
if __name__ == "__main__":
  
    """list to store objects"""
    objects = []
  
    motorCycle = MotorCycle()
    objects.append(Adapter(motorCycle, wheels = motorCycle.TwoWheeler))
  
    truck = Truck()
    objects.append(Adapter(truck, wheels = truck.EightWheeler))
  
    car = Car()
    objects.append(Adapter(car, wheels = car.FourWheeler))
  
    for obj in objects:
       print("A {0} is a {1} vehicle".format(obj.name, obj.wheels()))

类图

Adapter 方法的类图,它是一种结构设计模式

适配器方法类图

适配器类图

好处

  • 单一职责原则:我们可以通过适配器方法实现单一职责原则,因为这里我们可以将具体代码与客户端的主要逻辑分开。
  • 灵活性:适配器方法有助于实现代码的灵活性和可重用性。
  • 不太复杂的类:我们的客户端类并不因为必须使用不同的接口而变得复杂,并且可以使用多态性在适配器的不同实现之间进行交换。
  • Open/Closed 原则:我们可以在代码中引入新的 wadapter 类而不违反 Open/Closed 原则。

缺点

  • 代码的复杂性:当我们介绍了一组新的类、对象和接口时,代码的复杂性肯定会上升。
  • 适配性:大多数时候,我们需要对适配链进行多次适配,才能达到我们想要的兼容性。

适用性

  • 使类和接口兼容:当我们需要使某些类兼容以进行通信时,总是使用适配器方法。
  • 与继承相关:当我们想要重用某些代码,即缺少某些功能的类和接口时,可以使用Adapter Method来完成。

进一步阅读: Java中的适配器模式