7.适配器模式

1.定义

 将一个类的接口转换成客户希望的另外一个接口,适配器使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

实现适配器的两种方式,类适配器使用多继承,对象适配器使用组合组合就是一个类中放入另一类的对象。

2.分类

(1)类适配器模式

from abc import ABCMeta, abstractmethod

# 目标接口
class Payment(object, metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        pass

class Alipay(Payment):
    def pay(self, money):
        print('支付了%d' % money)

# 待适配的类
class BankPay():
    def cost(self, money):
        print('银联支付了%d' % money)

# 类适配器 【关键代码】
class PaymentAdapter(Payment, BankPay):
    """
    把不兼容cost转换成pay
    """

    def pay(self, money):
        self.cost(money)

p = PaymentAdapter()
p.pay(100)

类适配器继承了抽象类和待适配的类,通过实现抽象类中的具体方法,调用待适配类的方法,来保持一致性,高层代码的调用方法不变。

对单个的待适配类进行适配。

角色:

抽象目标接口

待适配的类

类适配器:进行类的适配,实现抽象目标接口,调用待适配类中方法

高层client客户端

(2)对象适配器

from abc import ABCMeta, abstractmethod

# 目标接口
class Payment(object, metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        pass

class Alipay(Payment):
    def pay(self, money):
        print('支付了%d' % money)

# 待适配的类
class BankPay():
    def cost(self, money):
        print('银联支付了%d' % money)

# 待适配的类
class ApplePay():
    def cost(self, money):
        print('苹果支付了%d' % money)

# 对象适配器 【关键代码】
class PaymentAdapter(Payment):
    def __init__(self, payment):
        self.payment = payment

    def pay(self, money):
        self.payment.cost(money)

p = PaymentAdapter(ApplePay())
p.pay(100)
p = PaymentAdapter(BankPay())
p.pay(100)
"""
苹果支付了100
银联支付了100
"""

对象适配器通过不继承待适配的类,只继承抽象目标接口,只需传入具体的待适配类的对象即可。通过调用待适配类的方法来实现抽象目标接口。

可以对一批待适配的类进行适配。

角色:

抽象目标接口

待适配类

适配器类:进行类的适配,实现抽象目标接口,调用待适配类中方法

高层client客户端

3.小结

适配器模式有三种角色,分别是目标接口、待适配的类和适配器。

适用场景:

想使用一个已存在的类,而它的接口不符合你的要求。

想使用一些已经存在的类,但是不可能对每一个都进行子类化以匹配它们的接口。

对象适配器可以适配它的父类接口。

你可能感兴趣的:(设计模式,设计模式)