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设计模式》

  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/zhzhang/p/11287648.html
Copyright © 2011-2022 走看看