适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。适配器模式的别名为包装器(Wrapper)模式,它既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合。
适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。
适配器的优点:
1:将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有结构。
2:增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一适配者类可以在多个不同的系统中复用。
3:灵活性和扩展性都非常好,通过使用配置文件,可以很方便的更换适配器,也可以在不修改原有代码的基础上 增加新的适配器,完全复合开闭原则。
适配器模式有两种:类适配器、对象适配器、接口适配器。
类适配器
首先我们定义一个客户需要的接口
/**
* Target(目标抽象类):目标抽象类定义客户所需的接口
*/
public interface Target {
void request();
}
然后定义个类,这个类需要适配,适配者类包好了客户希望的业务方法
/**
* Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口
*/
public class Adaptee {
public void adapteeRequest() {
System.out.println("我是客户需要使用的方法");
}
}
我们可以写一个适配器类
/**
* Adapter(适配器类):它可以调用另一个接口,作为一个转换器
* 对Adaptee和Target进行适配。它是适配器模式的核心。
*/
public class Adapter extends Adaptee implements Target{
@Override
public void request(){
super.adapteeRequest();
}
}
测试方法
public static void main(String[] args) {
Target adapterTarget = new Adapter();
adapterTarget.request();
}
运行结果
这样我们通过适配器类从目标接口调用到了客户需要的方法。但是由于java不支持多继承,如果需要适配多个方法就需要编写多个适配器类,这样很麻烦,不利于代码的整体结构。
对象适配器
对象适配器可以通过持有被适配对象,达到多个同时适配的效果
我们继续添加一个被适配对象
/**
* Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口
*/
public class Adaptee2 {
public void adapteeRequest() {
System.out.println("我是客户需要使用的方法2");
}
}
适配器类
/**
* Adapter(适配器类):它可以调用另一个接口,作为一个转换器
* 对Adaptee和Target进行适配。它是适配器模式的核心。
*/
public class Adapter2 implements Target{
//引用适配者对象
private Adaptee adaptee;
//引用适配者对象
private Adaptee2 adaptee2;
public Adapter2(){
adaptee = new Adaptee();
adaptee2 = new Adaptee2();
}
@Override
public void request(){
adaptee.adapteeRequest();
adaptee2.adapteeRequest();
}
}
测试方法
public static void main(String[] args) {
Target adapterTarget = new Adapter2();
adapterTarget.request();
}
运行结果
接口适配器
接口适配器区别于上面的适配器,在实现接口的时候需要对所有的方法进行实现,如果只需要其中的很多代码就产生了多余。我们可以使用接口适配器只写需要用到的接口。
创建一个接口
public interface Inter {
void inter1();
void inter2();
void inter3();
void inter4();
void inter5();
}
写一个抽象类实现这个接口
public abstract class Adapter implements Inter {
@Override
public void inter1() {
}
@Override
public void inter2() {
}
@Override
public void inter3() {
}
@Override
public void inter4() {
}
@Override
public void inter5() {
}
}
实现类继承这个抽象类,这样要用哪个方法就可以写上,不要用的就可以省略
public class InterImpl extends Adapter{
@Override
public void inter1() {
System.out.println("inter1");
}
@Override
public void inter2() {
System.out.println("inter2");
}
}