将一个类的接口转换成客户期望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。
优点:
缺点:
适配器类型有两种类型实现,一种是类适配器,一种是对象适配器。
让Adapter继承Adaptee类,Client在使用Target的request()接口(实际上是调用Adapter的request()方法)时,间接调用adapteeRequest()方法。
class Adaptee{ void adapteeRequest(){ System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adaptee.adapteeRequest"); } } interface Target{ void request(); } public class Adapter extends Adaptee implements Target{ @Override public void request() { System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adapter.request"); this.adapteeRequest(); } }
测试
@Test public void request() { Target target = new Adapter(); target.request(); }
上述类图
对比着类适配器理解。在Adapter内部创建Adaptee对象,Client在使用Target的request()接口(实际上是调用Adapter的request()方法)时,间接调用adapteeRequest()方法。
class Adaptee2{ void adapteeRequest2(){ System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adaptere2.adapteeRequest2"); } } interface Target2{ void request(); } public class Adapter2 implements Target2 { private Adaptee2 adaptee2; public Adapter2(Adaptee2 adaptee2) { this.adaptee2 = adaptee2; } @Override public void request() { System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adapter2.request"); adaptee2.adapteeRequest2(); } }
测试
@Test public void request() { Target2 target2 = new Adapter2(new Adaptee2()); target2.request(); }
上述类图
适配器模式包含一下三个角色:
Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于Java语言不支持多重继承,所以它很可能是接口。
Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。
Adaptee(被适配类):被适配类即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。
扩展-JDK1.7以及框架源码中的适配器模式
javax.xml.bind.annotation.adapters.XmlAdapter
org.springframework.aop.framework.adapter.AdvisorAdapter、MethodBeforeAdviceAdapter
org.springframework.orm.jpa.JpaVendorAdapter
org.springframework.web.servlet.HandlerAdapter、org.springframework.web.servlet.DispatcherServlet、org.springframework.web.servlet.mvc.Controller
2.1、分析org.springframework.web.servlet.HandlerAdapter
类图
2.1、分析org.springframework.web.servlet.mvc.Controller
类图
原文:https://www.cnblogs.com/bjlhx/p/11193799.html