赞
踩
适配器这个词我们应该很熟悉,天天都在使用,手机充电时,电源线头头就叫电源适配器,干什么用的呢?把220V电压转换成手机充电时使用的电压,那么适配器是不是很好理解了,下面看一下定义。
Adapter适配器模式,将一个类的接口转换成客户希望的另外一个接口。使原本由于接口不兼容而不能一起工作的那些类可以一起工作了。
适配器模式有“类适配器”和“对象适配器”两种不同的形式。
定义一个客户端使用的特定接口。
使用目标接口,与和目标接口一致的对象合作。
一个现存需要适配的接口。
负责将Adaptee的接口转换为Target的接口。适配器是一个具体的类,这是该模式的核心。
1、系统需要使用现有的类,从而类的接口不符合系统的需要。
2、想建立一个可以重复使用的类,用于一些彼此之间没有太大关联的一些类。
3、通过接口转换,将一个类插入另一个类中。
通过继承进行适配(类间继承)。URL结构图如下:
Target目标角色,该角色定义把其它类转换成期望接口,通常情况下是一个接口或一个抽象类,一般不会是实现类。
- public interface Target {
- public void request();
- }
Adaptee源角色,想把谁转换为目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象。
- public class Adaptee {
- public void specificRequest() {
- System.out.println("特殊请求");
- }
- }
Adapter适配器角色,是适配器模式的核心角色,它的职责是通过继承或类关联的方式把源角色转换成目标角色。
- public class Adapter extends Adaptee implements Target {
- @Override
- public void request() {
- super.specificRequest();
- }
- }
- package designMode.adapter.sxn;
-
- public class ConcreteTarget implements Target {
- @Override
- public void request() {
- System.out.println("普通请求");
- }
- }
- package designMode.adapter.sxn;
-
- public class Client {
- public static void main(String[] args) {
- //原有业务逻辑
- Target target = new ConcreteTarget();
- target.request();
-
- //增加适配器后的业务逻辑
- Target target2 = new Adapter();
- target2.request();
- }
- }
通过对象层次的关联关系进行委托(对象的合成关系/关联关系)。UML结构图如下:
客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
- package designMode.adapter.sxn;
-
- public class Target {
- public void request() {
- System.out.println("普通请求");
- }
- }
需要适配的类。
- package designMode.adapter.sxn;
-
- public class Adaptee {
- public void specificRequest() {
- System.out.println("特殊请求");
- }
- }
通过在内部包装一个Adaptee对象,把源接口转换成目标接口。
- package designMode.adapter.sxn;
-
- public class Adapter extends Target{
- private Adaptee adaptee = new Adaptee();
-
- @Override
- public void request() {
- adaptee.specificRequest();
- }
- }
- package designMode.adapter.sxn;
-
- public class Client {
- public static void main(String[] args) {
- Target target = new Adapter();
- target.request();
- }
- }
可以看到处理器的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用controller方法,需要调用的时候就得不断使用ifelse来进行判断是哪一种子类然后执行。那么如果后面要扩展controller,就得修改原来的代码,违背了开闭原则。
- package com.guor.adapter;
-
- public 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接口
- package com.guor.adapter;
-
- 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类
- package com.guor.adapter;
-
- import java.util.ArrayList;
- import java.util.List;
-
- 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的对象,
- // 适配器可以获取到希望的Controller
- HttpController 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...
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。