python 设计模式之适配器模式

python 设计模式之适配器模式

  • 定义:

    • 将一个类的接口变换成客户端期待的另一种接口,从而原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式和装饰器模式有一定的相似性,都起包装的作用,但二者本质上又是不同的,装饰器模式的结果,是给一个对象增加了一些额外的职责,而适配器模式,则是将另一个对象进行了”伪装“。两个类似的事情相似,但具有不同的接口时要使用该模式,可以使客户端统一调用同一接口。适配器通常是对现在业务的补偿式应用,在设计阶段尽量不要用适配器模式。
  • 优点:

    1. 适配器模式可以让两个接口不同,甚至关系不大的两个类一起运行
    2. 提高了类的复用度,经过伪装的类,可以充当新的角色
    3. 适配器可以灵活”拆卸“
  • 缺点:

    • 适配器模式与原配接口相比,毕竟增加了一层调用关系,所以,在设计系统时,不要使用适配器模式。
  • 案例:

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    # @Author         : Charlie Zhang
    # @Email          : [email protected]
    # @Time           : 2021/3/26 17:40
    # @Version        : 1.0
    # @File           : adapter.py
    # @Software       : PyCharm
    
    
    """
    步骤一:定义老接口
    """
    
    
    class Human(object):
        def __init__(self):
            self.name = "Human"
    
        def work(self, work_type):
            return "{} is a {}".format(self.name, work_type)
    
        # def __str__(self):
        #     return 'the Human name is: {}'.format(self.name)
    
    
    """
    步骤二:定义新接口
    """
    
    
    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def pet(self):
            return "{} is a dog, make fun".format(self.name)
        #
        # def __str__(self):
        #     return 'the Dog name is: {}'.format(self.name)
    
    
    class Computer(object):
        def execute(self, cpu, memory, hdd):
            return "execute projram, configure is cpu: {} memory: {} hdd: {} ".format(cpu, memory, hdd)
    
    
    """
    步骤三:定义适配器
    """
    
    
    class Adapter(object):
        def __init__(self, obj, adapt_method):
            """
            :param obj: 被适配的新接口对象
            :param adapt_method: dict(key, value),key为老接口方法,value为新接口方法
            """
            self.obj = obj
            self.obj.__dict__.update(adapt_method)
    
    
    """
    步骤四:新旧函数/方法适配
    """
    if __name__ == '__main__':
        computer_obj = Computer()
        Adapter(computer_obj, dict(work=computer_obj.execute))
    
        dog_obj = Dog("狗狗")
        Adapter(dog_obj, dict(work=dog_obj.pet))
    
        # 用统一的work适配不同对象的方法,这样在无需修改源对象的情况下就实现了不同对象方法的适配
        print(computer_obj.work("4 cores", "4G", "500G"))
        print(dog_obj.work())
    
    

你可能感兴趣的:(适配器模式,python)