JVM适配器模式
一、简介
适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。
适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。
根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种
在对象适配器模式中,适配器与适配者之间是关联关系;
在类适配器模式中,适配器与适配者之间是继承(或实现)关系。
二、角色
Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对适配者和目标类进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承目标类并关联一个适配者对象使二者产生联系。
Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。
适配器的优点:
1、将目标类和适配者类解耦
2、增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
3、灵活性和扩展性都非常好,符合开闭原则
缺省适配器模式(Default Adapter Pattern):当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式。缺省适配器模式是适配器模式的一种变体,其应用也较为广泛。在JDK类库的事件处理包java.awt.event中广泛使用了缺省适配器模式,如WindowAdapter、KeyAdapter、MouseAdapter等。
三、适配器实现
适配器模式将一个接口转为另外一个接口。它有三种实现方式:
(1)当希望将一个类转换为满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
(2)当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有适配者类的一个实例,在适配器类的方法中,调用<适配者>实例的方法就行。
(3)当不希望实现一个接口中所有的方法时,可以创建一个抽象类Adapter ,实现所有方法,我们写别的类的时候,继承抽象类即可。
1、类适配器
适配者类:
public class Adaptee { public void adapteeRequest() {
System.out.println("被适配者的方法");
}
}
目标抽象类:
public interface Target { void request();
}
适配器类:继承适配者类,实现目标抽象类
public class Adapter extends Adaptee implements Target{ @Override
public void request() {
//...一些操作...
super.adapteeRequest();
//...一些操作...
}
}
测试类:
public class Test { public static void main(String[] args) {
Target adapterTarget = new Adapter();
adapterTarget.request();
//这样我们即可在新接口 Target 中适配旧的接口或类
}
}
类适配器的优点:由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
类适配器的缺点:对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。
2、对象适配器
对象适配器与类适配器不同之处在于,类适配器通过继承来完成适配,对象适配器则是通过关联来完成。
这里稍微修改一下 Adapter
类即可将转变为对象适配器
public class Adapter implements Target{ // 注意这里的 适配器 是将 适配者 作为一个成员属性,而不是继承它
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
//...
adaptee.adapteeRequest();
//...
}
}
对象适配器的优点:把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。
对象适配器的缺点:与类适配器模式相比,要想置换适配者类的方法就不容易。
3、接口适配器:借助抽象类来实现适配器功能
目标接口:
public interface Target { void typec();
void typec2vga();
void typec2hdmi();
}
适配器抽象类:
/** * 定义一个抽象类
*
*/
public abstract class Adapter implements Target{
public void typec() { }
public void typec2vga() { }
public void typec2hdmi() { }
}
适配器实现类:
public class VgaAdapter extends Adapter{ public void typec() {
System.out.println("信息从Typec口的手机输出。");
}
public void typec2vga() {
System.out.println("接收到Type-c口信息,信息转换成VGA接口中...");
System.out.println("信息已转换成VGA接口,显示屏可以对接。");
}
}
测试类:
package com.jstao.adapter;/**
* 定义一个显示屏
* 与适配器对接
* @author jstao
*
*/
public class Screen {
public static void main(String[] args) {
System.out.println("-------------某一个适配器------------");
VgaAdapter vgaAdapter = new VgaAdapter();
vgaAdapter.typec();
vgaAdapter.typec2vga();//适配器将typec转换成vga
System.out.println("显示屏对接适配器,手机成功投影到显示屏!");
}
}
四、应用
1、spring MVC中的适配器模式
Spring MVC中的适配器模式主要用于执行目标 Controller 中的请求处理方法。
在Spring MVC中,DispatcherServlet 作为用户,HandlerAdapter 作为期望接口,具体的适配器实现类用于对目标类进行适配,Controller 作为需要适配的类。
Spring MVC 中的 Controller 种类众多,不同类型的 Controller 通过不同的方法来对请求进行处理。
如果不利用适配器模式的话,DispatcherServlet 直接获取对应类型的 Controller,需要的自行来判断,那将出现n个if else。
2、spring AOP中的适配器模式
在Spring的Aop中,使用的 Advice(通知) 来增强被代理类的功能。
Advice的类型有:MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice
在每个类型 Advice 都有对应的拦截器,MethodBeforeAdviceInterceptor、AfterReturningAdviceInterceptor、ThrowsAdviceInterceptor
Spring需要将每个 Advice 都封装成对应的拦截器类型,返回给容器,所以需要使用适配器模式对 Advice 进行转换。
以上是 JVM适配器模式 的全部内容, 来源链接: utcz.com/z/512630.html