程序猿学社的GitHub,欢迎Star
github技术专题
本文已记录到github
前言
到目前为止,创建型模式,我们已经知道是怎么一回事咯,从今天开始结构型模式的适配器模式相关学习。
结构型模式作用?
- 实现松耦合,从而可以扩大整体类结构,用来解决更大的问题
什么是适配器模式?
- 将一个类的接口转换成客户希望的另外一个接口。解决兼容性的问题,让原本因为不兼容不能一起工作的两个类可以一起工作。
工作原理
待适配的类:适配的类或者接口,定义待适配的接口
适配器:调用是适配的类,转为客户期望的类,解决兼容问题
目标:客户希望的接口或者类
场景案例
- CAN转USB接口
- 三口插座转为二口-转换插头
- usb网线转换器(主要是针对超薄本),无网线插头,可通过转换器实现
- 例如我们找工作,其实也是一个适配的过程,对照工作要求进行适配。
隔壁老王: “社长,你这说的都是啥,说的我一脸懵逼的,能否详细说说”
社长: “老王,刚刚我们已经知道适配器的概念和场景,你听着有点懵逼正常,那是因为刚刚都是停留在理论阶段,没有跟生活更好的结合起来,为了方便理解,我画了一个图”
实战
类适配器
网线
package com.cxyxs.designmode.adapter;
/**
* Description:网线
* Author: 程序猿学社
* Date: 2020/5/16 23:50
* Modified By:
*/
public class Reticle {
public void Internet(){
System.out.println("插上网线,开始网上冲浪。。。");
}
}
USB适配接口
package com.cxyxs.designmode.adapter;
/**
* Description:USB适配接口
* Author: 程序猿学社
* Date: 2020/5/17 0:22
* Modified By:
*/
public interface Usb {
public void conversion();
}
- 处理上网的请求
适配器
package com.cxyxs.designmode.adapter;
/**
* Description:适配器
* Author: 程序猿学社
* Date: 2020/5/16 23:55
* Modified By:
*/
public class UsbAdapter extends Reticle implements Usb{
@Override
public void conversion() {
super.Internet();
}
}
- 等价于USB转接器
电脑
package com.cxyxs.designmode.adapter;
/**
* Description:超薄电脑
* Author: 程序猿学社
* Date: 2020/5/16 23:52
* Modified By:
*/
public class UltraThinPc {
/**
* 网上冲浪
* @param usb
*/
public void surfing(Usb usb){
usb.conversion();
};
}
隔壁老王: “买了一台电脑,只有USB接口,我们需要上网咋办?”
社长: “我们需要买一个USB网线转换器,就可以实现上网功能,所以这里需要聚合一个USB的接口,这样就可以实现上网功能”
测试类
package com.cxyxs.designmode.adapter;
/**
* Description:
* Author: 程序猿学社
* Date: 2020/5/17 0:02
* Modified By:
*/
public class Client {
public static void main(String[] args) {
UsbAdapter usb = new UsbAdapter();
UltraThinPc ultraThinPc = new UltraThinPc();
ultraThinPc.surfing(usb);
}
}
社长: “说了这么多,我们来总结一下类适配器”
类适配器缺点:
- 类适配器(UsbAdapter)使用了单继承(Reticle网线),会有局限性。
隔壁老王: “既然,类适配器存在单继承的问题,有没有版本去改进”
社长: “有办法的,我们可以采用对象适配器的方式”
对象适配器
对象适配器
package com.cxyxs.designmode.adapter.newclass;
import com.cxyxs.designmode.adapter.Reticle;
import com.cxyxs.designmode.adapter.Usb;
/**
* Description:适配器
* Author: 程序猿学社
* Date: 2020/5/16 23:55
* Modified By:
*/
public class UsbNewAdapter implements Usb{
private Reticle reticle;
public UsbNewAdapter(Reticle reticle) {
this.reticle = reticle;
}
@Override
public void conversion() {
reticle.Internet();
}
}
- 把继承换成聚合,解决了单继承的问题
客户端
package com.cxyxs.designmode.adapter.newclass;
import com.cxyxs.designmode.adapter.Reticle;
import com.cxyxs.designmode.adapter.UltraThinPc;
import com.cxyxs.designmode.adapter.UsbAdapter;
/**
* Description:
* Author: 程序猿学社
* Date: 2020/5/17 0:02
* Modified By:
*/
public class NewClient {
public static void main(String[] args) {
//网线
Reticle reticle = new Reticle();
UsbNewAdapter usb = new UsbNewAdapter(reticle);
UltraThinPc ultraThinPc = new UltraThinPc();
ultraThinPc.surfing(usb);
}
}
作者:程序猿学社
原创公众号:『程序猿学社』,专注于java技术栈,分享java各个技术系列专题,以及各个技术点的面试题。
原创不易,转载请注明来源(注明:来源于公众号:程序猿学社, 作者:程序猿学社)。