适配器模式
Adapter Pattern:适配器模式,在GoF23种设计模式中属于结构型模式的一种。
适配器模式的作用就是提供将两个不兼容的事物可以进行合理正确的使用的功能。注意一个关键字,不兼容,意思是用户想要使用这个东西,但是和你提供的接口不兼容导致用户使用不了,如果直接不能使用那就会是用户体验不好,这个时候需要的就是通过一个适配器来让这个两个不兼容的东西变成兼容,可以使用。
结构
通过类图分析一下,适配器模式一共有三个角色:
- 目标对象角色:也就是不兼容的其中一方,这是客户想要使用的对象,而且也是客户必须使用的对象。
- 需要适配的对象角色:这是不兼容的另外一方,这是我们提供的对象,可以拱用户使用的对象。
- 适配器角色:当客户想要使用的和你提供的接口不兼容,两者不能互相通信使用的时候,适配器就要上场了,它要平衡不兼容两方之间的关系,使之变得兼容。
举例
- 电源适配器,嘿嘿,光从名字上就可以看出来这是使用了适配器模式的一种现实生活中的例子,我们的手机充电线的头,笔记本的头,台式机的电源都有适配器的作用,要知道我们的家庭电压是220V的电压,而手机充电一般在4V左右,适配器的作用呢就是将220V变成了4V。
- 网络适配器,又是一个从名字上就可以看出来的吧,这个呢就是我们俗称的网卡,我们经常上网的对于IP地址肯定是不陌生的,但是实际上我们的电脑通过网卡上网实际上是MAC物理地址,在网络上,每一台计算机都有一个独一无二的MAC地址。不会有任何两块生产出来的网卡具有相同的MAC 地址。而网卡就是将IP和MAC的适配器。
- 再来一个更加贴近生活的例子,存储卡大家都不陌生吧,在手机存储量还是不太大的时候,存储卡可是手机内存的重要指标。当我们需要在电脑上操作存储卡的时候,很遗憾计算机只提供了USB接口,存储卡是插不进去的,这个时候我们需要一个东西来帮助,那就是读卡器,通过将内存卡插入读卡器然后再将读卡器插入USB接口就可以正确使用了,这个读卡器也是适配器。
注意
-
适配器极大的提供了灵活性,甚至于可以让两个没有关联的类,一点儿都不兼容的类一起运行。
-
但是适配器也不是那么好使用的,因为客户调用的是他自己看到的那个对象,如果这时有多个适配器,这个调这个,那个调那个,那么实际使用起来无疑将使得代码变得非常混乱,不好控制。
-
适配器有两种模式,一种是对象适配器模式(适配器容纳一个需要适配的类的实例),另一种是类适配器模式(适配器继承自己适配的类)
需要注意的是类适配器模式一般是需要的多重继承,所以JAVA中是对象适配器模式。
一个小DEMO
-
场景
嗯,场景不多想,直接对着类图来个抽象的场景,对应上面的三个角色就成。
-
不兼容的第一方,也就是客户需要使用的一方的对象
/** * 适配器模式——用户使用的对象 * @author wq */ public class Target { public void show() { System.out.println("这是 Target类的方法,用户认为自己调用的方法"); } }
-
不兼容的另一方,也就是系统提供的一方的对象
/** * 适配器模式——需要被适配的类 * @author wq */ public class Adaptee { public void show() { System.out.println("这是Adaptee类的方法,这是系统本身提供的访问方法"); } }
-
适配器搭桥,将两个不兼容的变成兼容的
/** * 适配器模式——适配器类 * @author wq */ public class Adapter extends Target{ // 对象适配器模式,在自己的内部包装一个需要被适配的对象 private Adaptee adaptee = new Adaptee(); // 适配一下 @Override public void show() { // 将对target类方法的调用,转移到adaptee类的方法上 adaptee.show(); } }
-
测试类
/** * 适配器模式——测试类 * @author wq */ public class Main { public static void main(String[] args) { Target target = new Adapter(); // 调用target类的方法,此时适配器发生了作用 target.show(); } }
-
测试来一波
这是Adaptee类的方法,这是系统本身提供的访问方法
完成!!!
可见,此时调用的是通过适配器适配了之后的方法,不再是原本的方法了。
来源:CSDN
作者:Inevitability
链接:https://blog.csdn.net/qq_37932989/article/details/103461822