定义
Adapter适配器模式,将一个类的接口转换成客户希望的另外一个接口。使原本由于接口不兼容而不能一起工作的那些类可以一起工作了。
适配器模式有“类适配器”和“对象适配器”两种不同的形式。
适配器模式的结构:
- 目标(Target):定义一个客户端使用的特定接口。
- 客户端(Client):使用目标接口,与和目标接口一致的对象合作。
- 被适配者(Adaptee):一个现存需要适配的接口。
- 适配器(Adapter):负责将Adaptee的接口转换为Target的接口。适配器是一个具体的类,这是该模式的核心。
优缺点
优点:
- 可以让任何两个没有关联的类一起运行;
- 增加了类的透明性;
- 提高了类的复用度;
-
缺点:
过多使用适配器会使系统非常凌乱;
- 由于java是单继承的,所以只能适配一个适配器类,而且目标类必须是抽象的;
只有碰到无法改变原有设计和代码的情况下,才会考虑适配器模式;
适用场景
1、系统需要使用现有的类,从而类的接口不符合系统的需要。
2、想建立一个可以重复使用的类,用于一些彼此之间没有太大关联的一些类。
3、通过接口转换,将一个类插入另一个类中。适配器模式实现方法
Adaptee(被适配者)
//要被适配的类:网线public class Adaptee {public void request() {System.out.println("连接网线上网");}}
NetToUsb
//按接口转换器的抽象实现~public interface NetToUsb {//作用:处理请求,网线=>usbpublic void handleRequest();}
Adapter(适配器1) 继承模式
//真正的适配器,需要连接USB,连接网线~public class Adapter extends Adaptee implements NetToUsb {@Overridepublic void handleRequest() {//上网的具体实现,找一个转接头super.request();}}
Adapter2(适配器) 组合模式【推荐】
//真正的适配器,需 要连接USB,连接网线~public class Adapter2 implements NetToUsb {//组合模式private Adaptee adaptee;public Adapter2(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void handleRequest() {//上网的具体实现,找一个转接头adaptee.request();//可以上网}}
Computer ```java //客户端关: 想上:网,插不L:网线~ public class Computer { //我们的电脑需要连接:转换器才可以上网 public void net(NetToUsb adapter) {
//.上网的具体实现, 找个转换器adapter.handleRequest();
}
public static void main(String[] args) {//电脑,适配器,网线~Computer computer = new Computer(); //电脑Adaptee adaptee = new Adaptee(); //网线Adapter adapter = new Adapter(); //转按器computer.net(adapter);System.out.println("++++++++++++++++++++++++++++++");//电脑,适配器,网线~Computer computer = new Computer(); //电脑Adaptee adaptee = new Adaptee(); //网线Adapter2 adapter = new Adapter2(adaptee); //转换器computer.net(adapter);}
}
<a name="zeqAL"></a># 适配器模式在SpringMVC框架应用的源码剖析<a name="KTKlp"></a>#### 1.SpringMVC中的HandlerAdapter使用了适配器模式<a name="805v9"></a>#### 2.使用HandlerAdapter的原因分析可以看到处理器的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用controller方法,需要调用的时候就得不断使用if、else来进行判断是哪一种子类然后执行。那么如果后面要扩展controller,就得修改原来的代码,违背了开闭原则。<a name="yMmks"></a>#### 3.SpringMVC通过适配器模式获取对应的controller步骤- Spring定义了一个适配接口,使得每一种controller有一种对应的适配器实现类;- 适配器代替controller执行相应的方法- 扩展controller时,只需要增加一个适配器类就完成了SpringMVC的扩展;<a name="QICG4"></a>#### 4.模拟代码实现<br />controller接口```javapublic interface Controller {}class HttpController implements Controller {public void doHttpHandler() {System.out.println("http...");}}class SimpleController implements Controller {public void doSimplerHandler() {System.out.println("simple...");}}class AnnotationController implements Controller {public void doAnnotationHandler() {System.out.println("annotation...");}}
HandlerAdapter接口
public interface HandlerAdapter {public boolean supports(Object handler);public void handle(Object handler);}// 多种适配器类class SimpleHandlerAdapter implements HandlerAdapter {public void handle(Object handler) {((SimpleController) handler).doSimplerHandler();}public boolean supports(Object handler) {return (handler instanceof SimpleController);}}class HttpHandlerAdapter implements HandlerAdapter {public void handle(Object handler) {((HttpController) handler).doHttpHandler();}public boolean supports(Object handler) {return (handler instanceof HttpController);}}class AnnotationHandlerAdapter implements HandlerAdapter {public void handle(Object handler) {((AnnotationController) handler).doAnnotationHandler();}public boolean supports(Object handler) {return (handler instanceof AnnotationController);}}
DispatchServlet类
public class DispatchServlet {public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();public DispatchServlet() {handlerAdapters.add(new AnnotationHandlerAdapter());handlerAdapters.add(new HttpHandlerAdapter());handlerAdapters.add(new SimpleHandlerAdapter());}public void doDispatch() {// 此处模拟SpringMVC从request取handler的对象,// 适配器可以获取到希望的ControllerHttpController controller = new HttpController();// AnnotationController controller = new AnnotationController();//SimpleController controller = new SimpleController();// 得到对应适配器HandlerAdapter adapter = getHandler(controller);// 通过适配器执行对应的controller对应方法adapter.handle(controller);}public HandlerAdapter getHandler(Controller controller) {//遍历:根据得到的controller(handler), 返回对应适配器for (HandlerAdapter adapter : this.handlerAdapters) {if (adapter.supports(controller)) {return adapter;}}return null;}-------------------------------------------------------------------------------------public static void main(String[] args) {new DispatchServlet().doDispatch(); // http...}}

