[Python设计模式] 第17章 程序中的翻译官——适配器模式
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, abstractmethod
class Player():
__metaclass__ = ABCMeta
def __init__(self, name):
self.name = name
@abstractmethod
def attack(self):
pass
@abstractmethod
def defense(self):
pass
class 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 = name
def 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
[Python设计模式] 第17章 程序中的翻译官——适配器模式的更多相关文章
- 《Think Python》第17章学习笔记
目录 <Think Python>第17章学习笔记 17.1 面向对象的特性(Object-oriented features) 17.2 打印对象(Printing objects) 1 ...
- 像计算机科学家一样思考python-第1章 程序之道
1.7调试 程序是很容易出错的.因为某种古怪的原因,程序错误被称为bug,而查捕bug的过程称为调试(debugging). 一个程序中可能出现3种类型的错误:语法错误.运行时错误和语义错误.对它们加 ...
- [Python设计模式] 第16章 上班,干活,下班,加班——状态模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 用代码模拟一天的工作状态,上午状态好,中午想睡觉,下午渐恢复,加班苦煎熬. ...
- [Python设计模式] 第21章 计划生育——单例模式
github地址:https://github.com/cheesezh/python_design_patterns 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式 ...
- [Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...
- [Python设计模式] 第22章 手机型号&软件版本——桥接模式
github地址:https://github.com/cheesezh/python_design_patterns 紧耦合程序演化 题目1 编程模拟以下情景,有一个N品牌手机,在上边玩一个小游戏. ...
- 第17章 程序管理与SELinux初探
什么是进程 触发任何一个事件时,系统都会将它定义为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性关系,给予这个进程一组有效的权限设置. 进程与程序 进程:执行一个 ...
- [Python设计模式] 第28章 男人和女人——访问者模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 用程序模拟以下不同情况: 男人成功时,背后多半有一个伟大的女人: 女人成功 ...
- [Python设计模式] 第26章 千人千面,内在共享——享元模式
github地址:https://github.com/cheesezh/python_design_patterns 背景 有6个客户想做产品展示网站,其中3个想做成天猫商城那样的"电商风 ...
随机推荐
- BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树
原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ ...
- python3实现链表
1.链表的实现 a.链表的结构为: b.链表的实现方法; #链表结构实现 私有属性_pro_item是指向下个节点的指针,_item为此节点的值 class ChainDemo(): def __in ...
- Linux 常用基本指令
1.ls 参数: -a:列出所有目录(“.”开头的是隐藏文件) -l: 以长格式列出目录下的内容列表 2.cd cd 切换到家目录 cd ~ 切换到家目录 cd .. 切换到上一级目录 3.pwd ...
- 002.Ceph安装部署
一 前期准备 1.1 配置规格 节点 类型 IP CPU 内存 ceph-deploy 部署管理平台 172.24.8.71 2 C 4 G node1 Monitor OSD 172.24.8.72 ...
- Is there a TRY CATCH command in Bash
Is there a TRY CATCH command in Bash? No. Bash doesn't have as many luxuries as one can find in many ...
- Python flask+react+antd实现登陆demo
这两天在研究flask和antd,想把这俩个东西结合来使用,单独学antd的时候用的是dva来配置,但是发现这样与flask结合的话需要启动两个服务,作为flask只是作为数据的接口,并没用用到其强大 ...
- XamarinAndroid组件教程RecylerView适配器动画动画种类
XamarinAndroid组件教程RecylerView适配器动画动画种类 本节将讲解RecylerView适配器动画,其中包含动画种类和如何使用动画. 动画种类 RecylerViewAnimat ...
- iOS中 H5的input输入框focus()无法自动拉起键盘(解决方法)
ios的hybird APP 无法使用focus()获取焦点和键盘的问题. 解决方案 原来,在App的配置文件(config.xml),里面默认会有一句 1 <preference name=& ...
- 一次ARP病毒排查
XX公司网络卡断问题 1. 问题现象 2017年XX公司机关网络出现几次异常情况,并寻求内外部专家对异常情况进行诊断分析,均未找到原因,具体情况如下: 1.XX分公司机关网络IP地址为10.0.0. ...
- BZOJ.4399.魔法少女LJJ(线段树合并)
BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...