python设计模式-适配器模式

3,495次阅读
没有评论

共计 1445 个字符,预计需要花费 4 分钟才能阅读完成。

python设计模式-适配器模式

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

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

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

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

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__达到成员属性变量的赋值。

正文完
 
admin
版权声明:本站原创文章,由 admin 2018-08-03发表,共计1445字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)