[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

原文地址:https://www.cnblogs.com/CheeseZH/p/9458707.html

时间: 2024-11-05 22:44:41

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

设计模式@第17章:命令模式

第17章:命令模式 一.智能生活项目需求 ? 看一个具体的需求 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个 App,分别控制,我们希望只要一个 app 就可以控制全部智能家电. 要实现一个 app 控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口给 app 调用,这时 就可以考虑使用命令模式. 命令模式可将"动作的请求者"从"动作的执

[Python设计模式] 第16章 上班,干活,下班,加班——状态模式

github地址:https://github.com/cheesezh/python_design_patterns 题目 用代码模拟一天的工作状态,上午状态好,中午想睡觉,下午渐恢复,加班苦煎熬. 基础版本--函数版 hour = 0 work_finished = False def write_program(): if hour < 12: print("当前时间: {} 点, 上午工作,精神百倍".format(hour)) elif hour < 13: pr

网络设备中的“翻译官”-调制解调器

调制解调器,英文名-modem,俗称-"猫".港台叫做数据机. 他是一位"翻译官",实现计算机理解的数字信号和能在线路中传输的模拟信号之间的相互转变. 日常生活中用的宽带,光纤都会用到"猫". 各种信号的区别: 光.电.声,这个是从信息的载体角度来区分的: 数字.模拟,这个是从信息与时间的关系角度来区分的:

[Python设计模式] 第1章 计算器——简单工厂模式

写在前面的话 """ 读书的时候上过<设计模式>这一门课,当时使用的教材是程杰老师的<大话设计模式>,使用的语言是C#,学过课程之后初期深感面向对象思想的伟大,但是很少应用到实际开发中.后来我接触了Python,现在工作中用到最多的也是Python,或许是因为Python的便利性,我写的很多脚本/程序都还是面向过程编程,缺少面向对象的思想在里边.因此,我打算重读程杰老师的<大话设计模式>并用Python进行实践. ""&

第17章 程序管理与SELinux初探

什么是进程 触发任何一个事件时,系统都会将它定义为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性关系,给予这个进程一组有效的权限设置. 进程与程序 进程:执行一个程序或命令就可以触发一个事件而取得一个PID. 程序:系统仅仅认识二进制文件,当系统工作时,需要启动一个二进制文件,这个文件就是程序. 程序放在磁盘中,通过用户的执行来触发.触发后加载到内存中成为一个个体,这就是进程.每个进程有给予执行者的权限/属性等参数,并包括进程所需要的脚本与数据,最后再给予一

[Python设计模式] 第6章 衣服搭配系统——装饰模式

题目 设计一个控制台程序,可以给人搭配嘻哈风格(T恤,垮裤,运动鞋)或白领风格(西装,领带,皮鞋)的衣服并展示,类似QQ秀那样的. 基础版本 class Person(): def __init__(self, name): self.name = name def wear_T_shirts(self): print("T恤") def wear_big_trouser(self): print("垮裤") def wear_sneakers(self): pri

[Python设计模式] 第15章 如何兼容各种DB——抽象工厂模式

github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): """ 用户类,模拟用户表,假设只有ID和name两个字段 """ def __init__(self): self.id = None self.name = None class SqlServerUser(): ""&qu

[Python设计模式] 第18章 游戏角色备份——备忘录模式

github地址:https://github.com/cheesezh/python_design_patterns 题目 用代码模拟以下场景,一个游戏角色有生命力,攻击力,防御力等数据,在打Boss前后的数据值会发生变化,如果玩家挑战Boss失败,我们允许玩家可以将游戏数据恢复到与Boss决斗之前的状态. 基础版本 class GameRole(): def __init__(self): self.vitality = 0 self.attack = 0 self.defense = 0

设计模式之第17章-备忘录模式(Java实现)

设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道你们可曾记得爱情公寓里的一个经典的桥段~每次关谷和唐悠悠吵架的时候,总是可以进行“存档”,先干其他的事情,而后有时间的时候再继续“读档”,这是多么好的一个技能啊,想想吧,每次吵架,存档后可以做其他事情进行冷静一下,然后读档的时候已经冷静好了,是不是会清醒很多呢,是不是就不会有那么多的误会无法解除了呢