python 设计模式-适配器模式

适配器模式(Adapter pattern):是一种结构型设计模式,帮助我们实现两个不兼容的接口之前的兼容;样例:电子商务系统支持不同国家的货币交易,需要一个适配器,将其余的货币转化成一种货币最终进行交易。

设计模式一直遵从开放/封闭的原则(open/close principle),开放封闭原则是面向对象设计的的基本原则之一,声明一个软件实体应该对扩展是开放的,对修改则是封闭的

对于一些老旧代码进行重构这个有点不现实,对于一些厂商提供统一的接口,这个想修改原厂商的代码进行适配,这个更不切实际,所以适配器模式应运而生。

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'

    def get(self):
        """ 多余添加的方法 """
        return 'get a apple'


class Human:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return '{} the human'.format(self.name)

    def speak(self):
        return 'says hello'

    def see(self):
        """ 多余添加的方法 """
        return 'see a people'


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'

    def view(self):
        """ 多余添加的方法 """
        return 'view a program'


class Adapter:
    def __init__(self, obj, adapted_methods):
        self.obj = obj
        # 此处只适函数方法,其余的本身属性并没有适配
        self.__dict__.update(adapted_methods)
        # 将剩余的未适配的属性一块适配,不然打印name属性就会报错
        update_wrapper(self, obj)

    def __str__(self):
        return str(self.obj)


def main():
    objects = [Computer('Asus')]
    synth = Synthesizer('mog')
    objects.append(Adapter(synth, dict(execute=synth.play, view=synth.get)))
    human = Human('Bob')
    objects.append(Adapter(human, dict(execute=human.speak, view=human.see)))

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


if __name__ == '__main__':
    main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值