github地址:https://github.com/cheesezh/python_design_patterns

适配器模式

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

当系统的数据和行为都正确,但是接口不符时,我们应该考虑使用适配器模式,目的就是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

class Target():"""Target类,这是客户所期待的接口。可以是具体或抽象的类,也可以是接口。"""def request(self):print("普通请求")class Adaptee():"""需要适配的类"""def specific_request(self):print("特殊请求")class Adapter(Target):"""适配器,通过内部包装一个Adaptee对象,把源接口转换成目标接口"""def __init__(self):self.adaptee = Adaptee()def request(self):self.adaptee.specific_request()def main():target = Adapter()target.request()main()
特殊请求

何时使用适配器模式?

想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不想同时,就应该考虑使用适配器模式。

对于公司内部独立开发的系统,类和方法名的规范应当在设计之初就规定好,当接口不相同时,首先不应该考虑使用适配器,而是应该考虑通过重构统一接口。

只有在双方都不太容易修改的时候再使用适配器模式。

但是如果设计之初,我们准备使用第三方开发组件,而这个组件的接口于我们自己的系统接口是不相同的,而我们也完全没有必要为了迎合它而改动自己的接口,此时尽管在开发的设计阶段,也就是可以考虑用适配器模式来解决接口不同的问题。

题目

用程序模拟姚明到国外打NBA初期依赖翻译的场景。

from abc import ABCMeta, abstractmethodclass Player():__metaclass__ = ABCMetadef __init__(self, name):self.name = name@abstractmethoddef attack(self):pass@abstractmethoddef defense(self):passclass Forwards(Player):def attack(self):print("Forward {} attack".format(self.name))def defense(self):print("Forward {} defense".format(self.name))class Guards(Player):def attack(self):print("Guards {} attack".format(self.name))def defense(self):print("Guards {} defense".format(self.name))class ForeignCenter():def __init__(self, name):self.name = namedef jingong(self):print("Center {} jingong".format(self.name))def fangshou(self):print("Center {} fangshou".format(self.name))class Translator(Player):def __init__(self, name):self.foreign_center = ForeignCenter(name)def attack(self):self.foreign_center.jingong()def defense(self):self.foreign_center.fangshou()forwards = Forwards("FFF")
forwards.attack()guards = Guards("GGG")
guards.defense()center = Translator("CCC")
center.attack()
center.defense()
Forward FFF attack
Guards GGG defense
Center CCC jingong
Center CCC fangshou

转载于:https://www.cnblogs.com/CheeseZH/p/9458707.html

[Python设计模式] 第17章 程序中的翻译官——适配器模式相关推荐

  1. python如何在网络爬虫程序中使用多线程(threading.Thread)

    python如何在网络爬虫程序中使用多线程 一.多线程的基础知识 二.在网络爬虫中使用多线程 2.1 从单线程版本入手 2.2 将单线程版本改写为多线程版本 2.3 运行多线程版本程序 2.4 将多线 ...

  2. DNS服务器:小黑屋中的“翻译官”大神

    DNS服务器是一个外行听起来比较专业的词汇,大部分只是听说过DNS,却不知道DNS服务器是什么鬼:即便知道了DNS服务器是什么东西,却也很难明白DNS服务器背后的"翻译逻辑"是什么 ...

  3. c中获取python控制台输出_linux c程序中获取shell脚本输出的实现方法

    [转]Linux Shell脚本调试技术 本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 ...

  4. 读书笔记:《流畅的Python》第17章 使用future处理并发

    # 第17章 使用future处理并发""" 内容提要:concurrent.futures模块future的概念:是一种对象,表示异步执行的操作是concurrent. ...

  5. 慕课软件质量保证与测试(第九章.程序中隐藏错误数量估计)

    慕课金陵科技学院.软件质量保证与测试.第九章.软件质量与质量保证.程序中隐藏错误数量估计 0 目录 9 软件质量与质量保证 9.2 程序中隐藏错误数量估计 9.2.1 课堂重点 9.2.2 测试与作业 ...

  6. python list元素合并_Python程序中使用表达式合并List列表元素 - Python - 服务器之家...

    Python程序中使用表达式合并List列表元素 发布时间:2014-02-06 来源:服务器之家 在实现一个产品过程中,使用 Python Extension 需要一个语句将一个列表中子列表合并成为 ...

  7. python猜数游戏在程序中预设一个_一道Python简单程序结构练习题

    1.猜数游戏. 在程序中预设一个0~9之间的整数,让用户通过键盘输入所猜数字,如果大于预设的数, 显示"遗憾,太大了":如果小于预设的数,显示"遗憾,太小了": ...

  8. python工作状态_[Python设计模式] 第16章 上班,干活,下班,加班——状态模式

    题目 用代码模拟一天的工作状态,上午状态好,中午想睡觉,下午渐恢复,加班苦煎熬. 基础版本--函数版 hour = 0 work_finished = False def write_program( ...

  9. python打折简单程序每满_[Python设计模式] 第2章 商场收银软件——策略模式

    题目 设计一个控制台程序, 模拟商场收银软件,根据客户购买商品的单价和数量,计算总价. 基础版本 price = float(input("输入商品单价:")) number = ...

最新文章

  1. 进程管理supervisor的简单说明
  2. java基础相关知识
  3. 【C 语言】二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )
  4. android高仿微信UI点击头像显示大图片效果
  5. STL 源代码剖析 算法 stl_algo.h -- equal_range
  6. 百万数据报表:分析以及解决办法
  7. 如何在程序中不用加号实现加法_程序员那些事 | JavaScript基础(六)
  8. 2.2基本算法之递归和自调用函数_一文学会递归解题
  9. Stanley-系列一
  10. CnBlogs自定义博客样式
  11. C++11并发之std::mutex
  12. jquery 的模块化
  13. c语言读取sgy格式文件,用C语言读写SGY格式的地震数据文件
  14. 使用python判断素数
  15. 失业的程序员(十二):潜意识的智商
  16. x64dbgpy 自动化控制插件AIP手册
  17. google手机连接WIFI后总会提示“无法连接互联网“的解决方法
  18. 2016级移动应用开发在线测试14-MediaPlayer
  19. 测试喇叭SPL软件,SPL 立体声监听控制器 MTC 2381 评测
  20. 什么是ui设计师:ui设计学什么内容

热门文章

  1. 宝元系统u盘使用说明_教你如何使用U盘安装电脑系统
  2. python程序写诗_用Python作诗,生活仍有诗和远方
  3. js点击取消按钮关闭当前弹框_UI设计中“取消按钮”的分析详解
  4. 远程管理口怎么看地址_红烧羊肉怎么样做才能滋味浓郁,咸甜适口,且回味有奶香?看这里...
  5. np读取csv文件_被 Pandas read_csv 坑了
  6. php reflectionmethod,PHP ReflectionMethod getClosure()用法及代码示例
  7. 新东方mti百科知识pdf_20南航翻硕mti初试417上岸经验贴
  8. Win32ASM-进程学习[3]-读写进程空间
  9. undefined reference to `cv::VideoCapture::VideoCapture()'
  10. c语言语言教程0基础_C语言基础