Python适配器模式代码

Posted zhzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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设计模式》

 

以上是关于Python适配器模式代码的主要内容,如果未能解决你的问题,请参考以下文章

Python 设计模式 — 结构型模式 — 适配器模式

Python 设计模式:适配器模式

结构型设计模式 Structural Patterns :适配器 Adapter(Python 实现)

python-适配器模式

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

《精通Python设计模式》学习结构型之适配器模式