适配器模式
一.定义:
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
在生活中也有很多适配的例子,比如说手机充电,我国采用的220v电压,但是手机却只能支持5v左右的电压,那肯定服务直接用220v的电压嘛,所以电源适配器(充电器头)应运而生,它将220v的电压转换成了5v的,咱就可以愉快的使用了。
二.优点:
-
可以让任何两个没有关联的类一起运行。
-
提高了类的复用。
-
增加了类的透明度。
-
灵活性好。
-
系统需要使用现有的类,但现有的类却不兼容。
-
需要建立一个可以重复使用的类,用于一些彼此关系不大的类,并易于扩展,以便于面对将来会出现的类。
-
需要一个统一的输出接口,但是输入类型却不可预知。
三.缺点:
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
- 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
四.实列
结构:
公共类:
被适配的类
package 适配器模式.类适配模式;
/**
* 被适配的类
* @author mx
*/
public class Adaptee {
public void specificRequest()
{
System.out.println("适配者中的业务代码被调用!");
}
}
适配的接口
package 适配器模式.类适配模式;
public interface Target {
public void request();
}
1.类适配模式
适配器类
package 适配器模式.类适配模式;
/**
* 类适配器类
* @author mx
*/
public class ClassAdapter extends Adaptee implements Target {
public void request()
{
specificRequest();
}
}
测试
package 适配器模式.类适配模式;
public class ClassAdapterTest {
public static void main(String[] args)
{
System.out.println("类适配器模式测试:");
Target target = new ClassAdapter();
target.request();
}
}
结果:
解释: 在此案列中,我们无法通过Target的request方法直接调用Adaptee的specificRequest,所以我们采用了一个适配类,这个类是Adaptee的子类,又实现了Target的request方法,在request去调用父类的specificRequest方法,这就解决了不兼容的问题啦。但是类适配模式有较强的耦合性,不利于实际生产开发。
2.对象适配模式
对象适配类
package 适配器模式.对象适配模式;
import 适配器模式.类适配模式.Adaptee;
import 适配器模式.类适配模式.Target;
/**
* 对象适配器类
*
*/
public class ObjectAdapter implements Target {
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee)
{
this.adaptee=adaptee;
}
public void request()
{
adaptee.specificRequest();
}
}
测试
package 适配器模式.对象适配模式;
import 适配器模式.类适配模式.Adaptee;
import 适配器模式.类适配模式.Target;
/**
* @author mx
*/
public class ObjectAdapterTest
{
public static void main(String[] args)
{
System.out.println("对象适配器模式测试:");
Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee);
target.request();
}
}
结果:
解释:在对象适配器模式中,并没有及去继承被适配类Adaptee,而是在对象适配类中创建了一个被适配类的对象(相当于套了一层壳),我们在实现request方法时就去调用Adaptee的specificRequest就可以了,如此既实现了适配,就降低了耦合性。
五. 适配器模式与代理模式的区别
https://blog.csdn.net/weixin_49639753/article/details/120474087