• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

python设计模式-适配器模式

Python admin 4个月前 (08-03) 209次浏览 0个评论 扫描二维码

适配器模式主要解决的问题保留旧版本的接口的基础上,新开发的接口能够兼容到旧版本的系统上。其实我们重构旧版本的代码也可以实现相应功能的开发,但是这就违背的了开放与封闭原则,因此我们不会轻易去修改旧代码,除非你要重构旧版本的代码,都是通过增量式开发,同时兼容旧版本。

设计模式这东西只有在你要优化当前系统的时候才会使用到,不可能一开始全部的系统都是以设计模式的思维来维护,这样的情况下这个系统得多久才能完成。

下面举个例子来直白的了解一下适配器模式:

在这里旧版本功能就是电脑执行一个程序,新功能就是要保证其旧版本功能的基础上加入播放音乐等功能。

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 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 Adapter:

    def __init__(self, obj, adapted_methods):
        self.obj = obj
        self.__dict__.update(adapted_methods)
        #self.__dict__['name']=obj.name
    def __str__(self):
        return str(self.obj)

运行代码

from chapter4 import  adapter,external_1
def main():
    objects = [adapter.Computer('Asus')]
    synth = external_1.Synthesizer('moog')
    objects.append(adapter.Adapter(synth, dict(execute=synth.play)))
    human = external_1.Human('Bob')
    objects.append(adapter.Adapter(human, dict(execute=human.speak)))

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


main()

这个是从设计模式书上摘抄过来的,书上留的一个问题是,现在 Synthesizer,Human 和 Computer 都具有相同的成员变量 name,问如何修改适配器输出 name

我在上面的适配器中注释部分即提供了解决方法,直接修改适配器中的 __dict__ 成员,本来一开始想是用过重载 __getattr__ 函数来实现属性的访问,但是你要注意到 Computer 类是没有对饮的 obj 变量的,所以你还是报错,这样是行不通的,所以最后还是修改 __dict__ 达到成员属性变量的赋值。


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明python 设计模式-适配器模式
喜欢 (0)
admin
关于作者:

您必须 登录 才能发表评论!