python设计模式-适配器
定义:
将一个接口转换为客户希望的另一个接口,该模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
适配器模式又叫变压器模式,也叫包装模式(Wrapper),它的核心思想是将一个对象经过包装或转换后使它符合指定的接口,使得调用方可以像使用这接口的一般对象一样使用它。这一思想,在我们生活中可谓是处处可见,比如变压器插座,能让你像使用国内电器一样使用美标(110V)电器;还有就是各种转接头,如 MiniDP 转 HDMI 转接头、HDMI 转 VGA 线转换器、Micro USB 转 Type-C 转接头等。
角色:
- 目标(Target):即你期望的目标接口,要转换成的接口。
- 源对象(Adaptee):即要被转换的角色,要把水转换成目标角色。
- 适配器(Adapter): 适配器模式的核心角色,负责把源对象转换和包装成目标对象。
适用场景:
想使一个已经存在的类,但其接口不符合你的要求.想对一些已经存在的子类.不可能每一个都是用子类来进行适配,对象适配器可以适配其父类接口
优点:
- 可以让两个没关联的类一起运行,骑着中间转换的作用。
- 提高了类的复用。
- 灵活性好,不会破坏原有的系统
缺点:
- 如果原有系统没有设计好, 适配器模式将很难实现
- 过多地使用适配器,容易是代码结构混乱,如明明看到调用的是A接口,内部调用的却是B接口的实现
以身边故事为例,在公司虽然平常沟通都以普通话为准,但是来自五湖四海的小伙伴们也时常会说四川话,长沙话,客家话勉强能听懂....有天来了位外籍同事说英文,
这下慌了,英文一直是弱项。后来还是通过A同事帮忙翻译才能顺利沟通。这里的A同事其实就是一个适配器
class Language: def say(self): pass class ChangShaLanguage(Language): def __init__(self): self.__content = '恰饭冒?' def say(self): print(self.__content) class SiChuanLanguage(Language): def __init__(self): self.__content = '你在爪子?' def say(self): print(self.__content) class HakkaLanguage(Language): def __init__(self): self.__content = '肚使' def say(self): print(self.__content) class ForeignNationality: def __init__(self): self.__content = 'eat' def getContent(self): return self.__content class Adapter(ForeignNationality, Language): def say(self): print(self.translation(super().getContent())) def translation(self, content): return content+'=='+'吃了吗?' class Communication: def __init__(self): self.objs = [] def addLanguage(self, language): if language == '长沙话': self.objs.append(ChangShaLanguage()) elif language == '四川话': self.objs.append(SiChuanLanguage()) elif language == '客家话': self.objs.append(HakkaLanguage()) elif language == '外籍同事': self.objs.append(Adapter()) else: pass def communication(self): for obj in self.objs: obj.say() if __name__ == '__main__': p = Communication() p.addLanguage('长沙话') p.addLanguage('四川话') p.addLanguage('客家话') p.addLanguage('外籍同事') p.communication()
执行结果如下;
适配器相对来说容易理解,就不作更多例子说明了。