适配器模式

89 阅读4分钟

1. 一句话介绍

适配器模式是一种软件设计模式,它允许不兼容的接口协同工作,通过引入一个中间层(适配器)来转换一个类的接口,使其能够满足客户端的期望。

2. 详细介绍

适配器模式有两种实现方式:对象适配器和类适配器。对象适配器通过组合方式实现,适配器类包含一个指向适配者对象的引用;类适配器通过继承实现,适配器类继承自适配者类并实现目标接口。

2.1 模式结构

适配器模式包含四个主要角色:

  • Target(目标抽象类):定义客户端使用的特定领域的接口。
  • Adapter(适配器类):作为转换器,实现目标接口,并与适配者类交互,是适配器模式的核心。
  • Adaptee(适配者类):被适配的角色,定义了一个已经存在的接口,这个接口需要适配。
  • Client(客户类):针对目标抽象类进行编程,调用目标抽象类中定义的业务方法。

2.2 如何调用适配器模式相关的对象

客户端首先创建适配者对象,然后创建适配器对象并将适配者对象传递给适配器。客户端通过适配器的request(可以是适配者的任意方法,不一定是request)方法发起调用,适配器内部调用适配者对象的specificRequest方法。

3. 使用场景以及优缺点

  • 使用场景
    • 系统需要使用现有的类,而这些类的接口不符合系统的需要。
    • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类一起工作。
  • 优点
    • 解耦目标类和适配者类,通过适配器类重用现有的适配者类,而无需修改原有代码。
    • 增加类的透明性和复用性,客户端对适配者类的实现细节一无所知。
    • 系统灵活性和扩展性高,可以方便地更换或增加适配器类。
  • 缺点
    • 类适配器模式在不支持多重继承的语言中使用受限,不能同时适配多个适配者类。
    • 对象适配器模式置换适配者类的方法较为复杂,需要创建适配者类的子类。

4. 使用Python实现适配器模式

# 目标抽象类
class Target:
   def request(self):
       pass

# 适配者类
class Adaptee:
   def specificRequest(self):
       print("Adaptee: 特定请求的具体实现。")   

# 适配器类
class Adapter(Target):
   def __init__(self, adaptee):
       self.adaptee = adaptee

   def request(self):
       self.adaptee.specificRequest()

# 客户端代码
def clientCode(target):
   target.request()

# 创建适配者对象
adaptee = Adaptee()
# 创建适配器对象,将适配者传递给适配器
adapter = Adapter(adaptee)
# 客户端针对目标编程,调用适配器的request方法
clientCode(adapter)

上述Python代码展示了适配器模式的实现,其中Target是目标抽象类,Adaptee是被适配的类,Adapter是适配器类,它组合了Adaptee对象并通过request方法将调用转发到AdapteespecificRequest方法。最后,客户端通过适配器对象调用request方法,实现了对Adaptee的适配。

5. 简单练习【设计模式专题之适配器模式】6. 扩展坞

""" 
【设计模式专题之适配器模式】6. 扩展坞
时间限制:1.000S  空间限制:256MB
题目描述
小明购买了一台新电脑,该电脑使用 TypeC 接口,他已经有了一个USB接口的充电器和数据线,为了确保新电脑可以使用现有的USB接口充电器和数据线,他购买了一个TypeC到USB的扩展坞。

请你使用适配器模式设计并实现这个扩展坞系统,确保小明的新电脑既可以通过扩展坞使用现有的USB接口充电线和数据线,也可以使用TypeC接口充电。

输入描述
题目包含多行输入,第一行输入一个数字 N (1 < N <= 20),表示后面有N组测试数据。

之后N行都是一个整数,1表示使用电脑本身的TypeC接口,2表示使用扩展坞的USB接口充电。

输出描述
根据每行输入,输出相应的充电信息。
输入示例
3
1
2
1
输出示例
TypeC
USB Adapter
TypeC
"""

from abc import ABC, abstractmethod


class TypeC(ABC):
    @abstractmethod
    def charge(self):
        raise NotImplemented
        
class NewComputer(TypeC):
    def charge(self):
        print("TypeC")
        
class USB(ABC):
    @abstractmethod
    def charge(self):
        raise NotImplemented
        
class UsbCharger(USB):
    def charge(self, msg: str):
        print(msg)
        
class UsbChargerAdapter:
    def __init__(self, adaptee: UsbCharger):
        self.adaptee = adaptee
        
    def charge(self):
        self.adaptee.charge("USB Adapter")
        
def client():
    n = int(input())
    for _ in range(n):
        i = int(input())
        if i == 1:
            charger = NewComputer()
        # if i == 2:
        else:
            assert i == 2
            charger = UsbChargerAdapter(UsbCharger())
        charger.charge()
        
if __name__ == "__main__":
    client()

6. 参考文章