写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。
适配器模式(Adapter)
是一种行为型模式。
目录
一、概述
二、使用步骤
三、举例
一、概述
1、将一个类的接口转换成客户希望的另外一个接口;2、使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;3、适配器模式主要用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
1.1、主要的角色分三种,但从代码(或技术)实现的角度看(为了充分使用面向对象语言的3大特性封装、继承、多态,还另外需要抽象类或接口)可能有4个:
- 客户原本需要的类,包括:客户原本需要的类的抽象类或接口(单个)+ 客户原本需要的类的实现类(多个)
- 需要适配的旧对象(数量没有明确限定)
- 适配器(数量没有明确限定)
1.2、直观的理解上发起方使用需要适配的旧对象的流程如下:
1.3、通过技术实现的角度看,对象之间关系的UML图如下:
二、使用步骤
- 先确定哪些对象不能被直接使用;
- 针对这些对象建立相应的适配器;
- 请求发起类直接在需要的时候直接调用适配器即可。
三、举例
简单举例,假设主程序需要一个普通请求,和一个特殊请求,其中主程序没有办法直接调用特殊请求。
对于本例,由于比较简单,可以不需要对普通请求对象进行抽象,我们在实践时也是一样,如果问题本身不是太复杂,也就不需要刻意花功夫去进行抽象,在其他模式种也一样。所以我们只需要加一个适配器即可。
3.1、设计之后,对象之间的关系用UML图表示如下:
3.2、Java实现代码如下(建议你在本地试一下,加深印象):
普通请求类:
public class Target {
public void request() {
System.out.println("普通请求!");
}
}
特殊请求(被适配的对象):
public class Adaptee {
public void specificRequest(){
System.out.println("特殊请求!");
}
}
适配器:
public class Adapter extends Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.specificRequest();
}
}
主程序(发起请求的类):
public class Main {
public static void main(String[] args) {
//普通请求
Target target1 = new Target();
target1.request();
//适配后的请求
Target target2 = new Adapter();
target2.request();
}
}
这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。
如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!