适配器模式可以将一个类的接口和另一个类的接口匹配起来,而无须修改原来的适配者接口和抽象目标类接口。适配器模式定义如下:
适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。 |
【注:在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合。】
在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。在实际开发中,对象适配器的使用频率更高,对象适配器模式结构如图9-3所示:
图 9-3 对象适配器模式结构图
在对象适配器模式结构图中包含如下几个角色:
● Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
● Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
类的适配器模式
比如有这样一个变压器,可以转换220V电压和380V电压
- public class Transformer{
- public void change220V(){
- //输出10V电压
- }
- public void change380V (){
- //输出10V电压
- }
- }
现在需要增加一种功能,转换500V的电压,下面用类的适配器模式改造
先定义一个接口,列出了所有需要的转换功能
- public interface ITransformer{
- public abstract void change220V();
- public abstract void change380V();
- public abstract void change500V();
- }
适配器继承了Transformer类并实现了ITransformer接口
- public classAdapter extends Transformer implements ITransformer{
- public void change500V(){
- //输出10V电压
- }
- }
Adapter继承了Transformer类,所以change220V方法与change380V方法都已经存在,只需要实现ITransformer接口中的change500V方法即可
现在Adapter类就可以转换220V、380V、500V三种类型的电压了
因为Adapter继承了Transformer,java是单继承的语言,这个适配器只能为Transformer这一个类服务,所以称之为类的适配器模式
对象的适配器模式
与类的适配器模式不同的是,对象的适配器模式把要改造的目标聚合到适配器类中,同样的变压器问题,对象的适配器模式写法如下:
Transformer类和ITransformer接口与上面完全一样
- public class Adapter implements ITransformer{
- Transformertransformer ;
- //由构造方法传入Transformer对象
- public Adapter (Transformer transformer){
- this.transformer = transformer;
- }
- // Transformer类中存在的方法则直接调用
- public void change220V(){
- transformer.change220V();
- }
- public void change380V (){
- transformer.change220V();
- }
- // Transformer类中没有的方法则新建
- public void change500V(){
- //输出10V电压
- }
- }