博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
想要什么适配什么?
阅读量:5238 次
发布时间:2019-06-14

本文共 1255 字,大约阅读时间需要 4 分钟。

适配器模式

1、内容

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

 

2、角色

  • 目标接口(Target)

  • 待适配的类(Adaptee)

  • 适配器(Adapter)

 

3、使用场景

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

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

 

4、优点  

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

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

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

5、缺点

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

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

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

     

6、两种实现方式

  • 类适配器:使用多继承

  • 对象适配器:使用组合

     

7、代码示例

from  abc import abstractmethod,ABCMetaclass Payment(metaclass=ABCMeta):   @abstractmethod   def pay(self,money):       raise NotImplementedErrorclass 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全套视频资料

转载于:https://www.cnblogs.com/IT-Scavenger/p/9578361.html

你可能感兴趣的文章
java-内存模型
查看>>
文本相似度比较(网页版)
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
2019.01.13 bzoj4538: [Hnoi2016]网络(树链剖分)
查看>>
codeforces 315 308
查看>>
国际知名品牌广告语欣赏(英汉)
查看>>
内置函数
查看>>
solr安全-tomcat
查看>>
BZOJ3998 [TJOI2015]弦论 【后缀自动机】
查看>>
超大背包
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
svn 架设
查看>>
k8s部署rocketmq 双主
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
Java Socket实战之一 单线程通信
查看>>
redis伪集群环境搭建
查看>>
POJ1742 Coins(男人八题之一)
查看>>
有表 student 和 course 。student中有course_ids。 现要把 course_ids 换成 course_names。...
查看>>
深入剖析阿里巴巴云梯YARN集群
查看>>
win7 32bit python2.7 python manage.py syncdb -> No module named MySQLdb
查看>>