zoukankan      html  css  js  c++  java
  • Python适配器模式代码

    Python设计模式之适配器模式,代码,思考等

    # -*- coding: utf-8 -*-
    # author:baoshan
    
    
    class Computer:
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
            return 'the {} computer'.format(self.name)
    
        def execute(self):
            return 'executes a program'
    
    
    class Synthesizer:
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
            return 'the {} synthesizer'.format(self.name)
    
        def play(self):
            return 'is playing an electronic song'
    
    
    class Human:
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
            return '{} the human'.format(self.name)
    
        def speak(self):
            return 'says hello'
    
    
    class Adapter:
        def __init__(self, obj, adapted_methods):
            self.obj = obj
            self.__dict__.update(adapted_methods)
    def __str__(self):
            return str(self.obj)
    
    
    def main():
        objects = [Computer('Asus')]
        synth = Synthesizer('moog')
        objects.append(Adapter(synth, dict(execute=synth.play)))
        human = Human('Bob')
        objects.append(Adapter(human, dict(execute=human.speak)))
        for i in objects:
            print('{} {}'.format(str(i), i.execute()))
    if __name__ == '__main__':
        main()

    代码输出:

    the Asus computer executes a program
    the moog synthesizer is playing an electronic song
    Bob the human says hello

    ------------------------------------------------------------------------------------------

    我们设法使得Human和Synthesizer类与客户端所期望的接口兼容,且无需改变它们的源代码。这太棒了!

    这里有一个为你准备的挑战性练习,当前的实现有一个问题,当所有类都有一个属性name时,以下代码会运行失败。

        for i in objects:
            print('{}'.format(i.name))

    首先想想这段代码为什么会失败?虽然从编码的角度来看这是有意义的,但对于客户端代码来说毫无意义,客户端不应该关心“适配了什么”和“什么没有被适配”这类细节。我们只是想提供一个统一的接口。该如何做才能让这段代码生效?

    思考一下如何将未适配部分委托给包含在适配器类中的对象。

    答案如下:

    将适配器类更改如下,增加一行代码

    class Adapter:
        def __init__(self, obj, adapted_methods):
            self.obj = obj
            self.__dict__.update(adapted_methods)
            self.name = obj.name
    
        def __str__(self):
            return str(self.obj)

    然后在main函数中获取对应的name,如下

    def main():
        objects = [Computer('Asus')]
        synth = Synthesizer('moog')
        objects.append(Adapter(synth, dict(execute=synth.play)))
        human = Human('Bob')
        objects.append(Adapter(human, dict(execute=human.speak)))
        for i in objects:
            print('{} {}'.format(str(i), i.execute()))
            print('{}'.format(i.name))
    
    if __name__ == '__main__':
        main()

    输出结果如下:

    the Asus computer executes a program
    Asus
    the moog synthesizer is playing an electronic song
    moog
    Bob the human says hello
    Bob

    参考自:《精通Python设计模式》

  • 相关阅读:
    man arch
    封装 pyinstaller -F -i b.ico excel.py
    Python比较两个excel文档内容的异同
    运维工具
    python封装成exe
    OCP内容
    OCP
    操作系统
    转:铁大树洞APP视频讲解和原型演示
    2020.3.31——针对超能陆战队铁大树洞项目的匿名特点分析
  • 原文地址:https://www.cnblogs.com/zhzhang/p/11287648.html
Copyright © 2011-2022 走看看