第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()))