码迷,mamicode.com
首页 > 编程语言 > 详细

Python适配器模式代码

时间:2019-08-02 13:08:58      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:ict   date   ret   改变   一行代码   包含   答案   color   思考   

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适配器模式代码

标签:ict   date   ret   改变   一行代码   包含   答案   color   思考   

原文地址:https://www.cnblogs.com/zhzhang/p/11287648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!