《Android源码设计模式》之适配器模式

适配器模式介绍

适配器模式在我们的开发中使用率极高,从代码中随处可见的Adapter就可以判断出来。说到底,适配器是将两个不兼容的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得它们能够协作起来。

适配器模式的定义

适配器模式把一个类的接口换成客户端所期待的另一种接口,从而使原本因接口欧不匹配而无法在一起工作的两个类能够在一起工作。

适配器模式的使用场景
  • 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容。
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  • 需要一个统一的输出接口,而输入端的类型不可预知。
适配器模式的UML类图

适配器模式也分两种,即类适配器模式和对象适配器模式,首先学习类适配器模式,结构图如下:
在这里插入图片描述
如图所示,类适配器是通过实现Target接口以及继承Adaptee类来实现接口转换,例如,目标接口需要的是operation2,但是Adaptee对象只有一个operation3,因此就出现了不兼容的情况。此时通过Adapter实现一个operation2函数将Adaptee的operation3转换为Target需要的operation2,以此实现兼容。

角色介绍:

  • Target:目标角色,也就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。
  • Adaptee:现在需要适配的接口。
  • Adapter:适配器角色,也是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
适配器模式的简单示例

用电源接口做例子,笔记本电脑的电源一般都是用5V电压,但是我没生活中的电线电压一般是220V,这时就出现了不匹配的状况,在软件开发中我们称为接口不兼容,此时就需要适配器来进行接口转换。
在上述电源接口这个示例中,5V电压就是Target接口,220V电压就是Adaptee类,而将电压从220V转换到5V就是Adapter。

类适配器模式:
package com.guifa.patterndemo.adapterpattern;

// Target角色
public interface FiveVolt {
    public int getVolt5();
}
package com.guifa.patterndemo.adapterpattern;

// Adaptee角色,需要被转换的对象
public class Volt220 {
    public int getVolt220() {
        return 220;
    }
}
package com.guifa.patterndemo.adapterpattern;

// Adapter角色,将220V的电压转换成5V电压
public class VoltAdapter extends Volt220 implements FiveVolt {

    @Override
    public int getVolt5() {
        return 5;
    }
}
package com.guifa.patterndemo.adapterpattern;

public class Test {
    public static void main(String[] args) {
        VoltAdapter adapter = new VoltAdapter();
        int volt5 = adapter.getVolt5();
        System.out.println("输出电压:" + volt5);
    }
}

输出结果:

输出电压:5

Process finished with exit code 0
对象适配器模式:

对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用代理关系连接到Adaptee类。示例代码如下:

package com.guifa.patterndemo.adapterpattern;

// Target角色
public interface FiveVolt {
    public int getVolt5();
}
package com.guifa.patterndemo.adapterpattern;

// Adaptee角色,需要被转换的对象
public class Volt220 {
    public int getVolt220() {
        return 220;
    }
}

package com.guifa.patterndemo.adapterpattern;

// Adapter角色,将220V的电压转换成5V电压
public class VoltAdapter implements FiveVolt {

    private Volt220 volt220;

    public VoltAdapter(Volt220 volt220) {
        this.volt220 = volt220;
    }

    public int getVolt220() {
        return volt220.getVolt220();
    }

    @Override
    public int getVolt5() {
        return 5;
    }
}
package com.guifa.patterndemo.adapterpattern;

public class Test {
    public static void main(String[] args) {
        VoltAdapter adapter = new VoltAdapter(new Volt220());
        int volt5 = adapter.getVolt5();
        System.out.println("输出电压:" + volt5);
    }
}

这种实现方式直接将要被适配的对象传递到Adapter中,使用组合的形式实现接口兼容的效果。这比类适配器方式更为灵活,它的另一个好处是被适配对象中的方法不会暴露处理,而类适配器由于继承了被适配对象,因此,被适配对象类的函数在Adapter类中也都含有,这使得Adapter类出现一些奇怪的接口,用户使用成本较高。因此,对象适配器模式更加灵活、实用。

总结

Adapter模式的经典实现在于将原本不兼容的接口融合在一起,使之能够很好地进行合作。

优点:

  • 更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的服用。
  • 更好的扩展性:在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。

缺点:

  • 过多地使用适配器,会让系统非常凌乱,不易整体把握。例如,明明看的调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此,如果不是很有必要,可以不适用适配器,而是直接对系统进行重构。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值