首页 > 编程 > Python > 正文

Python适配器模式代码实现解析

2019-11-25 12:07:34
字体:
来源:转载
供稿:网友

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

# -*- coding: utf-8 -*-# author:baoshanclass 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 programthe moog synthesizer is playing an electronic songBob 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 programAsusthe moog synthesizer is playing an electronic songmoogBob the human says helloBob

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表