博主声明:
转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。
适配器模式(Adapter Pattern),在我最熟悉的 Android 领域开发来说,它几乎是所到之处必须适配的,哈哈。为什么这么说呢?因为像我们的 Android 应用中,几乎每一个页面都会有大量的信息浏览条目,像新闻、消息、评论等都是一条一条的列下来,而在 Android 中要实现这样的功能,可以用到的有 ListView 和 RecyclerView 两种组件,而这两种组件必须设置一个适配器,也就是调用 setAdapter 方法来展示数据内容的,所以我就以这个例子代码为基础,来写一个适配器模式简单运用的例子。
首先,我们来看一下适配器模式的定义:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
反正不是很好理解,我看了几遍都不知道它要表达什么意思。概念这东西就是比较抽象,不太容易记住。下面我将通过我们身边每个人几乎都使用过的充电器为例子,学习一下适配器模式。
引入我们的主题内容:充电器。我们知道手机充电器的充电一端有好几种接口,最早之前的 mp3 的接口,然后到 Android 接口、苹果接口、最后有 type-C 接口等等。但即便这样,充电头依然是 Usb 接口的,这也是为了方便,我们只有充电线,不管是Android 、苹果、type-C 也好,只要一个充电头就能适配三种手机的充电功能,这不就是活生生的适配器模式嘛,我也是想了半天才决定写这个例子,虽然其他书上也有很多适配器模式的案例,但是我就是要独具一格,坚持写自己的观点,当然了,有错请指出,我虚心接受,嘻嘻。
关于适配器模式,我真的想不到什么好的故事,或者例子。我之前那几篇设计模式,比如:工厂模式 — 制茶工厂、策略模式 — 诸葛亮排兵布阵、装饰模式 — 人靠衣装马靠鞍等,都带有一定的小故事,以主人翁为背景引出设计模式,感兴趣的可以点击蓝颜色链接,去瞧一瞧,看一看,请多多支持呀。不过博主写作能力与想象力也有限,这个适配器模式暂时只能想到充电器这个例子了。
好了,废话也不多说了,推送一下自己写的文章,走个流程,哈哈。接下来,看代码时间,因为本篇代码超级简单,尽量多写一点字。来看我们的充电器类:
package com.xww.dp.adapter;
/**
* 充电器、充电头,支持 Usb 接口
*
* @author xww
*
*/
public class Charger<T> implements Usb {
T adapter;
public void setAdapter(T adapter) {
this.adapter = adapter;
}
@Override
public void Charge() {
if (adapter != null)
((Usb) adapter).Charge();
}
}
这个充电器类你可以想象为充电头,它拥有一个输出的 usb 接口,非常形象吧,继续看我们的 usb 接口代码:
package com.xww.dp.adapter;
/**
* Usb 数据线
*
* @author xww
*
*/
public interface Usb {
void Charge();
}
这个接口相当于数据线,可以提供对手机进行充电的功能。接下来是两个适配器类,表示两条数据线:
package com.xww.dp.adapter;
/**
* 安卓手机 usb 数据线适配器
*
* @author xww
*
*/
public class AndroidUsbLineAdapter implements Usb {
public AndroidUsbLineAdapter() {
}
@Override
public void Charge() {
System.out.println("可以充 Android 手机");
}
}
package com.xww.dp.adapter;
/**
* 苹果手机 usb 数据线适配器
*
* @author xww
*
*/
public class AppleUsbLineAdapter implements Usb {
public AppleUsbLineAdapter() {
}
@Override
public void Charge() {
System.out.println("可以充 Apple 手机");
}
}
最后,来看我们的客户端代码:
package com.xww.dp.adapter;
/**
* 适配器模式
*
* @author xww
* @博客:https://blog.csdn.net/smile_running?t=1
*/
public class AdapterPatternClient {
public static void main(String[] args) {
Charger usb = new Charger();
// usb.setAdapter(new AndroidUsbLineAdapter());
usb.setAdapter(new AppleUsbLineAdapter());
usb.Charge();
}
}
看代码就非常形象的说明一切了,根据我们的生活中用到的充电器一模一样啊,先实例化一个充电头,然后通过适配器模式为其切换安卓或者苹果的数据线,然后两种手机都可以充电啦。
最后看它们的输出结果,只要通过 new 不同的适配器,就可以即使的切换充电工作,你充一次,我充一次,哈哈。
好了,是不是觉得非常的简单呢,那适配器模式的用法就是这样了,这个例子已经非常形象的说明了适配器的作用,这两个适配器数据线类,就相当于解决了两个类不兼容,但可以在一此工作的问题。