设计模式之适配器模式
##应用场景
比如说:
1.我的手机是type-c 接口,但是我的耳机线是圆孔接口,耳机线不能直接插在手机上面用。于是我买了个转换线,然后耳机就可以直接插在手机上用了。
2.电脑分屏想必大家知道。很多时候我们的电脑都无法直接连接拓展屏,然后需要淘宝买一个HDMI转Vaga的转接器,然后才能连接。
3.生活中的USB与ps/2键盘的转接,以及插座盒插头也是一样的道理
适配器模式就是让原来接口不兼容,因为接口不匹配不能一起工作的类可以一起工作。
##三大角色
1.Target(目标抽象类):目标抽象类定义客户所需要的接口 ,可以是接口
案例中的耳机线,屏幕,USB接口
2.Adapter(适配器类):通过包装一个适配的对象,把原接口转换成目标接口,对Adaptee和Target进行适配
案例中的手机与电脑转接线,转接的插头
3.Adaptee(适配者类):它定义了一个已存在的接口,这个接口需要适配,它包装好了客户需要的业务方法。
案例中手机,电脑,ps/2键盘
##类适配器(使用继承的方式)
定义Adaptee
/**
* 适配者类
* (相当于例子中的,手机,电脑,ps/2键盘)
* @author admin
*
*/
public class Adaptee {
public void request(){
System.out.println("可以完成客户请求需要的功能");
}
}
定义接口Target
public interface Target {
void handleReq();//处理请求
}
定义实现类
/**
* 适配器类(类适配器方式)
* (相当于手机与电脑转接线,转接的插头)
* @author admin
*
*/
public class Adapter extends Adaptee implements Target {
public void handleReq() {
super.request();
}
}
测试一
/**
* 客户端
* (相当于例子中的手机,只有Type-C接口)
* @author admin
*
*/
public class Client {
public void test1(Target t){
t.handleReq();
}
public static void main(String[] args) {
Client c=new Client();//耳机线
Adaptee a=new Adaptee();//手机
Target t=new Adapter();//转接线
c.test1(t);
}
}
测试一结果
因为这边是extends继承某个类过来,所以称之为类适配器。但是弊端很明显,因为在java中,只支持单继承,这种方法不灵活
##对象适配器(使用组合的方式)
/**
* 适配器(类适配器方式,使用了组合的方式跟适配对象整合)
* (相当于手机与电脑转接线,转接的插头)
*
* @author admin
*
*/
public class Adapter2 extends Adaptee implements Target {
private Adaptee adaptee;//创建属性
public void handleReq() {
adaptee.request();
}
public Adapter2(Adaptee adaptee) {//将属性作为参数传入
super();
this.adaptee = adaptee;
}
}
测试二
/**
* 客户端
* (相当于例子中的手机,只有Type-C接口)
* @author admin
*
*/
public class Client2 {
public void test1(Target t){
t.handleReq();
}
public static void main(String[] args) {
Client2 c=new Client2();
Adaptee a=new Adaptee();
Target t=new Adapter2(a);//传入被适配的对象
c.test1(t);
}
}
测试二结果:
我们学习中见过的场景(字符流 转字节流)
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWrite(OutputStream)
##适配器模式的优势
1.解耦:将目标类和适配者类解耦,通过适配器类的引入来重用适配者类
2.复用性:一个适配者类可以在多个不同的系统中复用
3.灵活性与扩展性很强:使用配置文件可以方便的更换适配器,能够在不改动源代码基础上,添加新的适配器符合开闭原则
##小结
在本文中,提到了如下几点:
1适配器模式的应用场景
2适配器模式的三大角色
3.类适配器(使用继承的方式)与对象适配器(使用组合的方式)
4.适配器模式的优势
每学完一个设计模式,都感觉很神奇,刷新了很多自己的认知,后续也会慢慢的结合自己在项目上的实践来完善这些设计模式。