走穿23种设计模式-8适配器模式详解

104 篇文章 14 订阅
20 篇文章 4 订阅

走穿23种设计模式-8适配器模式详解

适配器模式,也叫变压器模式。在适配器模式下,变压器的作用是把一种电压变成另一种电压。
上面是用生活相关的词语解析。
其实适配器对我们Android程序员来说是非常非常熟悉的了,我们使用ListView就要用到适配器Adapter,这里适配器的作用就是把一些数据(经过一定的封装/排序),变成我们一列列的数据。

一.适配器模式的现实场景:人工翻译

王小华打算去图书馆借书,但是因为是新生,不熟悉路,正愁时对面走来一个外国朋友。王小华上前打听,可是英语水平有限,没有办法与对方进行交流。此时,他的同学李良刚好经过,而且他的英语口语很好,王小华请李良做他的翻译跟对方交流,最终他顺利知道去图书馆的路。

在上面场景中,王小华需要知道去图书馆的路,外国友人知道去图书馆的路,但是王小华听不懂英语,这是需要李良这个翻译把英语翻译过来,这里李良就相当于一个适配器的作用,把一种语言变成另一种需要的语言。

二.适配器模式(Adapter Pattern)的定义

将一个类的接口变成客户端所期待的另一个接口,从而使原本应接口不匹配而无法在一起工作的两个类能够在一起。

三.适配器模式的类图

1

四.适配器设计的三个角色

1.目标角色(Target):该角色定义要转换成的目标接口。

2.源角色(Adapee):需要被转换成目标角色的源角色。

3.适配器角色(Adapter):该角色是适配器模式的核心,其职责是通过继承或者类相关的方式,将源角色转换成目标角色。

五.适配器的优点

1.适配器可以让两个没有任何广西的类在一起运行。

2.增加了类的透明性

3.增加了类的复用性

4.增加了代码的灵活性

六.适配器模式的使用场景

修改一个已经投产的系统时,需要对系统进行扩展,如果需要一个已有的类进行扩展,这个类不符合接口,这时使用适配器模式是最适合的,这样可以将一个不符合系统接口的类转换成符合系统接口、可以使用的类。

适配器模式的实例

这里以文中开头的现实场景:将中文转换为英文做实例代码设计。

实例类图

2
这里和上面适配器模式类图的样式有点不一样。
适配器角色可以继承源角色关联源角色,也是可以把适配器角色对象放到源角色中进行相关,Android中的listView就是用第二种来相关的。

实例代码

1.目标角色IEnglish

package p8_adapter;

/**
 * 目标角色
 * 定义源角色要变成上面样子的规范接口
 */
public interface IEnglish {
    public void speakEnglish(String chinese);
}

2.适配器角色TranslaterAdapter

package p8_adapter;

/**
 * 语言适配器
 * 将中文转化成英文
 * 这里的适配器是做实际的操作
 */
public class TranslaterAdapter implements IEnglish {
    /**
     * 将中文翻译成英文的一个类
     */
    @Override
    public void speakEnglish(String chinese) {
        System.out.println("适配器把中文:‘" + chinese + "’翻译成英文:");
        System.out.println("Hello,where is the library?");
    }
}

3.源角色Chinese

package p8_adapter;

/**
 * 源角色,没经过转换前的对象数据
 */
public class Chinese {

    String msg;

    //构造方法
    public Chinese(String message) {
        System.out.println("问:" + message);
        msg = message;
    }

    //添加适配器,并要适配器做操作
    public void setAdatper(IEnglish english) {
        english.speakEnglish(msg);
    }
}


4.适配器测试类AdapterDemo

package p8_adapter;

/**
 * 适配器模式测试类
 */
public class AdapterDemo {

    public static void main(String[] arg) {
        Chinese chinese = new Chinese("请问图书馆怎么走??");//创建源对象
        IEnglish adapter = new TranslaterAdapter();//创建适配器对象,这里用多态
        chinese.setAdatper(adapter);//把适配器对象放到源对象做操作
    }
}


到这里适配器模式就简单介绍完了。
但是鉴于我们Android开发者对ListView的适配器Adapter的熟悉,我还是对Android适配器和设计模式的适配器做一些个人理解说給大家听:
我们android经常使用的Adapter:BaseAdapter、ArrayAdapter、SimpleAdapter。
BaseAdapter就像适配器模式中的目标角色,定义了基本接口和方法,你实现了BaseAdapter后实现相关的方法就可以得到适配器角色。接着就可以給适配器放入数据进行整合。
而ArrayAdapter和SimpleAdapter已经是适配器角色,可以直接放入数据,实现数据的整理功能。
通过适配器的方法接收把数据源对象的数据,刷新适配器。

大家也可以看看,我之前写的几种模式的详解:

装饰模式:http://blog.csdn.net/wenzhi20102321/article/details/78336273

代理模式:http://blog.csdn.net/wenzhi20102321/article/details/78209493

创建型模式详解:http://blog.csdn.net/wenzhi20102321/article/details/78175558

原型模式:http://blog.csdn.net/wenzhi20102321/article/details/78167984

建造者模式:http://blog.csdn.net/wenzhi20102321/article/details/78163855

抽象工厂模式:http://blog.csdn.net/wenzhi20102321/article/details/78153437
工厂方法模式:http://blog.csdn.net/wenzhi20102321/article/details/78129065
可以仔细对比一下工厂方法模式和抽象工厂模式,看看概念,看看类图,看看代码,就会明白了。

单例模式:http://blog.csdn.net/wenzhi20102321/article/details/77882203

java 23种设计模式介绍:http://blog.csdn.net/wenzhi20102321/article/details/54601909

共勉:不过怎样都要往前走。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值