第1篇---Python设计模式之适配器模式+含代码实现

本文通过两个实例,深入浅出地介绍了适配器模式在Python中的应用。首先,通过姚明加入NBA需要翻译的场景,展示了如何使用适配器模式解决不同接口之间的兼容性问题。其次,通过将Computer类与Synthesizer、Human类进行适配,进一步解释了适配器模式的灵活性和实用性。
摘要由CSDN通过智能技术生成

这里我们讲两个例子并且用Python实现:

  • 第一个例子:

     大话设计模式中的例子,NBA球星中分为前锋,中锋,后卫,它们交流都是英语。假如中国球星姚明刚开始加入NBA,他肯定不能和队员,教练正确交流,因为他不会英文。这个时候,我们就需要给姚明请一个翻译人员,既能和姚明交流,又能和教练交流,翻译人员在这个过程中起的就是一个适配器的作用。再举个不恰当的栗子:假如你手机没电了,你会怎么办? 废话,肯定是找充电器充电,那你为什么不把手机直接插到插排上? 因为你的手机和插座不匹配,你需要找充电器起个桥梁作用,这个充电器就起的是适配的作用。

接下来,我们用Python实现姚明加入NBA,需要请翻译的例子:

import abc

# 定义抽象类
class Player(metaclass=abc.ABCMeta):
    # 构造函数
    def __init__(self, name):
        self.name = name

    @abc.abstractmethod
    def Attack(self):
        pass

    @abc.abstractmethod
    def Defense(self):
        pass

# 定义前锋类
class Forwards(Player):
    def __init__(self, name):
        Player.__init__(self, name)  # 父类初始化

    def Attack(self):
        print("前锋{}进攻".format(self.name))

    def Defense(self):
        print("前锋{}防守".format(self.name))

# 定义中锋类
class Center(Player):
    def __init__(self, name):
        Player.__init__(self, name)  # 父类初始化

    def Attack(self):
        print("前锋{}进攻".format(self.name))

    def Defense(self):
        print("前锋{}防守".format(self.name))

# 定义后卫类
class Guards(Player):
    def __init__(self, name):
        Player.__init__(self, name)  # 父类初始化

    def Attack(self):
        print("前锋{}进攻".format(self.name))

    def Defense(self):
        print("前锋{}防守".format(self.name))

# 当前中锋是姚明,他不认识Attack和Denfense所以需要一个翻译作为适配器,为了适配姚明和英语

# 在这里定义一个外籍中锋类
class ForeignCenter:
    def __init__(self, name):
        self.name = name

    def 攻击(self):
        print('外籍中锋{}在进攻'.format(self.name))

    def 防守(self):
        print('外籍中锋{}在防守'.format(self.name))


# 定义一个翻译人员的类,作为适配器

class Translator(Player):
    def __init__(self, name):
        Player.__init__(self, name)
        self.wjzf = ForeignCenter(name)
    def Attack(self):
        self.wjzf.攻击()

    def Defense(self):
        self.wjzf.防守()

if __name__ == '__main__':

    # 前锋实例化
    b = Forwards('巴蒂尔')
    b.Attack()

    # 后卫实例化
    m = Guards('麦克格雷迪')
    m.Attack()

    # 外籍中锋实例化
    ym = Translator('姚明')
    ym.Attack()


  • 第二个例子

      天空飘来三个类(一个叫做Computer, 另外两个叫做Synthesizer,Human),我们现在想做的就是将Computer类和Synthesizer,Human做适配。假设这三个类都不能改。用户只知道Computer中的execute()方法,怎样调用Synthesizer 的play()方法和Human中的speak()方法? 此时我们就需要考虑做个适配器Adapter。

下面是Python代码的实现

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)   # adapterd_method是一个字典,键是客户调用的方法,值是被调用的方法。这种实现缺失妙呀!
    def __str__(self):
        return str(self.obj)

if __name__ == '__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()))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

传道解惑也

打赏一下咯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值