适配器模式(AdapterPattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
类图结构实现时使用了构成原则,适配器实现了其中一个对象的接口,并对另一个对象进行封装。所有流行的编程语言都可以实现适配器。
类图说明:
Target(目标接口):客户端需要的接口。
Adapter(适配器):将源接口适配成目标接口的中间件。
Adaptee(适配者类):需要被适配的接口。
Client(客户端):客户端代码只需通过目标接口与适配器交互即可,无需与具体的适配器类耦合。
实现方式确保至少有两个类的接口不兼容:
一个无法修改(通常是第三方、遗留系统或者存在众多已有依赖的类)的功能性服务类。
一个或多个将受益于使用服务类的客户端类。
声明客户端接口,描述客户端如何与服务交互。
创建遵循客户端接口的适配器类。所有方法暂时都为空。
在适配器类中添加一个成员变量用于保存对于服务对象的引用。通常情况下会通过构造函数对该成员变量进行初始化,但有时在调用其方法时将该变量传递给适配器会更方便。
依次实现适配器类客户端接口的所有方法。适配器会将实际工作委派给服务对象,自身只负责接口或数据格式的转换。
客户端必须通过客户端接口使用适配器。这样一来,你就可以在不影响客户端代码的情况下修改或扩展适配器。
适用场景当你希望使用某个类,但是其接口与其他代码不兼容时,可以使用适配器类。
适配器模式允许你创建一个中间层类,其可作为代码与遗留类、第三方类或提供怪异接口的类之间的转换器。
如果您需要复用这样一些类,他们处于同一个继承体系,并且他们又有了额外的一些共同的方法,但是这些共同的方法不是所有在这一继承体系中的子类所具有的共性。
你可以扩展每个子类,将缺少的功能添加到新的子类中。但是,你必须在所有新子类中重复添加这些代码,这样会使得代码有坏味道。
将缺失功能添加到一个适配器类中是一种优雅得多的解决方案。然后你可以将缺少功能的对象封装在适配器中,从而动态地获取所需功能。如要这一点正常运作,目标类必须要有通用接口,适配器的成员变量应当遵循该通用接口。这种方式同装饰模式非常相似。
示例代码下面的示例代码使用适配器模式,实现将原本只会说英语的人,将其适配成同声翻译者。
目标接口
publicinterfaceSpeakTarget{voidspeakEnglish();voidspeakChinese();voidspeakFrench();}被适配者
publicclassEnglishSpeaker{publicvoidspeakEnglish(){("Icanspeakenglish!");}}适配器
publicclassSpeakAdapterextsEnglishSpeakerimplementsSpeakTarget{@OverridepublicvoidspeakChinese(){("通过适配器,将英语转换为中文,我可以说中文");}@OverridepublicvoidspeakFrench(){("通过适配器,将英语转换为法语,我可以说法语了");}@OverridepublicvoidspeakEnglish(){();}}客户端
publicclassClient{publicstaticvoidmain(String[]args){SpeakTargetspeakTarget=newSpeakAdapter();();();();}}