结构型模式

  结构型模式:适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式。

一、适配器模式

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

1、适配器模式实现

(1)类适配器:使用多继承

from abc import ABCMeta, abstractmethod


class Payment(metaclass=ABCMeta):
    # abstract class
    @abstractmethod
    def pay(self, money):
        pass

class Alipay(Payment):
    def pay(self, money):
        print("支付宝支付%d元." % money)

class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%d元." % money)

class BankPay:
    def cost(self, money):   # 没有使用pay方法
        print("银联支付%d元." % money)

# 第一种适配器模式:使用多继承
class NewBankPay(Payment, BankPay):
    def pay(self, money):   # 把本来不兼容的接口cost转为兼容的接口pay
        self.cost(money)

p = NewBankPay()
p.pay(100)   # 银联支付100元.

  使用这种适配器模式,就将本来不兼容的接口cost转变为兼容的接口pay。

(2)对象适配器:使用组合

  组合:在一个类里放入另外一个类的对象。

class A:
    pass
class B:
    def __init__(self):
        self.a = A()

  根据组合来实现代码复用,实现多个不兼容接口的适配:

from abc import ABCMeta, abstractmethod

class Payment(metaclass=ABCMeta):
    # abstract class
    @abstractmethod
    def pay(self, money):
        pass

class Alipay(Payment):
    def pay(self, money):
        print("支付宝支付%d元." % money)

class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%d元." % money)

class BankPay:
    def cost(self, money):   # 没有使用pay方法
        print("银联支付%d元." % money)

class ApplePay:
    def cost(self, money):
        print("苹果支付%d元" % money)

# 第一种适配器模式:使用多继承
# class NewBankPay(Payment, BankPay):
#     def pay(self, money):   # 把本来不兼容的接口cost转为兼容的接口pay
#         self.cost(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)   # 苹果支付100元

  这种使用组合来实现的适配器模式就叫做对象适配器。

2、适配器模式总结

角色:

  • 目标接口(Target)
  • 待适配的类(Adaptee)
  • 适配器(Adapter)

适用场景:

  • 想使用一个已经存在的类,而它的接口不符合你的要求。
  • (对象适配器)想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配它们的接口,对象适配器可以适配它的父类接口。

 

上一篇:375. Guess Number Higher or Lower II


下一篇:python-day25_接口类_封装