当前位置: 首页 > news >正文

Python与设计模式--适配器模式

23种计模式之 前言 +(5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、+(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、+(11)策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 + 设计原则

7-Python与设计模式–适配器模式

一、外包人员系统兼容

假设某公司A与某公司B需要合作,公司A需要访问公司B的人员信息,但公司A与公司B协议接口不同,
该如何处理?先将公司A和公司B针对各自的人员信息访问系统封装了对象接口。
class ACpnStaff:name=""id=""phone=""def __init__(self,id):self.id=iddef getName(self):print "A protocol getName method...id:%s"%self.idreturn self.namedef setName(self,name):print "A protocol setName method...id:%s"%self.idself.name=namedef getPhone(self):print "A protocol getPhone method...id:%s"%self.idreturn self.phonedef setPhone(self,phone):print "A protocol setPhone method...id:%s"%self.idself.phone=phoneclass BCpnStaff:name=""id=""telephone=""def __init__(self,id):self.id=iddef get_name(self):print "B protocol get_name method...id:%s"%self.idreturn self.namedef set_name(self,name):print "B protocol set_name method...id:%s"%self.idself.name=namedef get_telephone(self):print "B protocol get_telephone method...id:%s"%self.idreturn self.telephonedef set_telephone(self,telephone):print "B protocol get_name method...id:%s"%self.idself.telephone=telephone

为在A公司平台复用B公司接口,直接调用B公司人员接口是个办法,但会对现在业务流程造成不确
定的风险。为减少耦合,规避风险,我们需要一个帮手,就像是转换电器电压的适配器一样,
这个帮手 就是协议和接口转换的适配器。 适配器构造如下:

class CpnStaffAdapter:b_cpn=""def __init__(self,id):self.b_cpn=BCpnStaff(id)def getName(self):return self.b_cpn.get_name()def getPhone(self):return self.b_cpn.get_telephone()def setName(self,name):self.b_cpn.set_name(name)def setPhone(self,phone):self.b_cpn.set_telephone(phone)

适配器将B公司人员接口封装,而对外接口形式与A公司人员接口一致,达到用A公司人员接口访问B公司人员信息的效果。
业务示例如下:

if __name__=="__main__":acpn_staff=ACpnStaff("123")acpn_staff.setName("X-A")acpn_staff.setPhone("10012345678")print "A Staff Name:%s"%acpn_staff.getName()print "A Staff Phone:%s"%acpn_staff.getPhone()bcpn_staff=CpnStaffAdapter("456")bcpn_staff.setName("Y-B")bcpn_staff.setPhone("99987654321")print "B Staff Name:%s"%bcpn_staff.getName()print "B Staff Phone:%s"%bcpn_staff.getPhone()

打印如下:

A protocol setName method…id:123 A protocol setPhone method…id:123
A protocol getName method…id:123 A Staff Name:X-A A protocol
getPhone method…id:123 A Staff Phone:10012345678 B protocol set_name
method…id:456 B protocol get_name method…id:456 B protocol
get_name method…id:456 B Staff Name:Y-B B protocol get_telephone
method…id:456 B Staff Phone:99987654321

二、适配器模式

适配器模式定义如下:将一个类的接口变换成客户端期待的另一种接口,从而使原本因接口不匹配而无法在一起
工作的两个类能够在一起工作。适配器模式和装饰模式有一定的相似性,都起包装的作用,但二者本质上又是不
同的,装饰模式的结果,是给一个对象增加了一些额外的职责,而适配器模式,则是将另一个对象进行了“伪装”。适配器可以认为是对现在业务的补偿式应用,所以,尽量不要在设计阶段使用适配器模式,
在两个系统需要兼容时可以考虑使用适配器模式。

三、适配器模式的优点和使用场景

优点:
1、适配器模式可以让两个接口不同,甚至关系不大的两个类一起运行;
2、提高了类的复用度,经过“伪装”的类,可以充当新的角色;
3、适配器可以灵活“拆卸”。

应用场景:
1、不修改现有接口,同时也要使该接口适用或兼容新场景业务中,适合使用适配器模式。
例如,在一个嵌入式系统中,原本要将数据从Flash读入,现在需要将数据从磁盘读入,
这种情况可以使用适配器模式,将从磁盘读入数据的接口进行“伪装”,以从Flash中读数据的接口形
式,从磁盘读入数据。

四、适配器模式的缺点

1、适配器模式与原配接口相比,毕竟增加了一层调用关系,所以,在设计系统时,不要使用适配器模式。

相关文章:

  • C语言数据结构之顺序表(上)
  • 在 CentOS 7 上安装 MySQL 8
  • AI数字人直播大屏:创新科技赋能企业的未来
  • 如果每天工资按代码行数来算,来看看你每天工资是多少
  • 【Python】多年数据分成不同sheet
  • Leetcode—2336.无限集中的最小数字【中等】
  • 蓝桥杯day02——Fizz Buzz
  • 超声波清洗机器哪个品牌好用?这四款都夸的超声波清洗机
  • Hive数据库与表操作
  • Git设置多个仓库同时推送
  • Encoder、Decoder和Encoder-Decoder
  • leetcode每日一题35
  • 【matlab程序】图像最大化填充画布
  • PyTorch入门教学——加载数据(Dataset)
  • 智能学习台灯_AI摄像头学习机基于MTk8175方案
  • canvas 绘制双线技巧
  • classpath对获取配置文件的影响
  • exif信息对照
  • js面向对象
  • React系列之 Redux 架构模式
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Terraform入门 - 3. 变更基础设施
  • windows下使用nginx调试简介
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 嵌入式文件系统
  • 区块链分支循环
  • 微信小程序开发问题汇总
  • 详解移动APP与web APP的区别
  • 小程序测试方案初探
  • 整理一些计算机基础知识!
  • ###C语言程序设计-----C语言学习(3)#
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (¥1011)-(一千零一拾一元整)输出
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (27)4.8 习题课
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (十一)图像的罗伯特梯度锐化
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (小白学Java)Java简介和基本配置
  • (转)EOS中账户、钱包和密钥的关系
  • .net MVC中使用angularJs刷新页面数据列表
  • .net 无限分类
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ 数据结构 - C++] AVL树原理及实现
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [AIGC] Java 和 Kotlin 的区别
  • [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
  • [I2C]I2C通信协议详解(一) --- 什么是I2C
  • [JavaWeb]——获取请求参数的方式(全面!!!)
  • [LeetCode]—Permutations II 求全排列(有重复值)