想要什么适配什么?

适配器模式

1、内容

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

2、角色

  • 目标接口(Target)

  • 待适配的类(Adaptee)

  • 适配器(Adapter)

3、使用场景

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

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

4、优点  

  • 将目标类和适配者类解耦

  • 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性

  • 灵活性和扩展性都非常好,符合开闭原则

5、缺点

  • 一次最多只能适配一个适配者类,不能同时适配多个适配者。

  • 适配者类不能为最终类,在C#中不能为sealed类

  • 目标抽象类只能为接口,不能为类,其使用有一定的局限性。

6、两种实现方式

  • 类适配器:使用多继承

  • 对象适配器:使用组合

7、代码示例

from  abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):
   @abstractmethod
   def pay(self,money):
       raise NotImplementedError

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


class ApplePay(Payment):
   def pay(self, money):
       print("苹果支付%s元"%money)

# =========待适配器==========
class WechatPay:
   def huaqian(self,a,b):
       print("微信支付%s元" % (a + b))

# ==========类适配器===========
class RealWeChatPay(Payment,WechatPay):
   def pay(self,money):
       return self.huaqian(money,0)


#===========对象适配器===========
class PavAdepter(Payment):
   def __init__(self,payment):
       self.payment = payment
       
   def pay(self,money):
       return self.payment.huaqian(money,0)

######使用=============
PavAdepter(WechatPay()).pay(100)

识别图中二维码,领取python全套视频资料

猜你喜欢

转载自blog.csdn.net/ZhangQiye1993/article/details/82348166