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

这里我们讲两个例子并且用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()))

 

全部评论

相关推荐

点赞 评论 收藏
分享
09-29 17:44
已编辑
蔚来_测(准入职员工)
//鲨鱼辣椒:见不了了我实习了四个月上周再投筛选了一天就给我挂了
点赞 评论 收藏
分享
面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务