设计模式(13) --适配器模式(3种实现方式)

简介: 设计模式(13) --适配器模式(3种实现方式)

基本介绍


1dc618a0ed9580ce8bfa6facb208c08f.png


适配器模式工作原理


5d4c6812c8535adbb050f4ddf2e1bce8.png



三种实现方式


类适配器模式



46a9d80a6e05e4e3b19d57a0ee70bcdf.png


代码:

66ba272a0bfc97be54a5fa679e3d5482.png

Voltage220V


//被适配的类
public class Voltage220V {
  //输出220V的电压
  public int output220V() {
  int src = 220;
  System.out.println("电压=" + src + "伏");
  return src;
  }
}


IVoltage5V


//适配接口
public interface IVoltage5V {
  public int output5V();
}


VoltageAdapter


//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
  @Override
  public int output5V() {
  // TODO Auto-generated method stub
  //获取到220V电压
  int srcV = output220V();
  int dstV = srcV / 44 ; //转成 5v
  return dstV;
  }
}


测试:Client


public class Client {
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  System.out.println(" === 类适配器模式 ====");
  Phone phone = new Phone();
  phone.charging(new VoltageAdapter());
  }
}

1dc618a0ed9580ce8bfa6facb208c08f.png


注意:


5d4c6812c8535adbb050f4ddf2e1bce8.png


对象适配器


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


类图

66ba272a0bfc97be54a5fa679e3d5482.png

代码:

88b9988b40447cb37c7e3c492d49867f.png

其他类不变,改下适配器类VoltageAdapter:


//适配器类
public class VoltageAdapter  implements IVoltage5V {
  private Voltage220V voltage220V; // 关联关系-聚合 
  //通过构造器,传入一个 Voltage220V 实例
  public VoltageAdapter(Voltage220V voltage220v) {  
  this.voltage220V = voltage220v;
  }
  @Override
  public int output5V() {  
  int dst = 0;
  if(null != voltage220V) {
    int src = voltage220V.output220V();//获取220V 电压
    System.out.println("使用对象适配器,进行适配~~");
    dst = src / 44;
    System.out.println("适配完成,输出的电压为=" + dst);
  }  
  return dst;  
  }
}


测试Client



1dc618a0ed9580ce8bfa6facb208c08f.png1dc618a0ed9580ce8bfa6facb208c08f.png

public class Client {
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  System.out.println(" === 对象适配器模式 ====");
  Phone phone = new Phone();
  phone.charging(new VoltageAdapter(new Voltage220V()));
  }
}

1dc618a0ed9580ce8bfa6facb208c08f.png


总结


5d4c6812c8535adbb050f4ddf2e1bce8.png


接口适配器


46a9d80a6e05e4e3b19d57a0ee70bcdf.png

安卓上使用接口适配器的实例:

66ba272a0bfc97be54a5fa679e3d5482.png

88b9988b40447cb37c7e3c492d49867f.png


自己写个案例:

1dc618a0ed9580ce8bfa6facb208c08f.png

5d4c6812c8535adbb050f4ddf2e1bce8.png

Interface4


public interface Interface4 {
  public void m1();
  public void m2();
  public void m3();
  public void m4();
}


AbsAdapter


//在AbsAdapter 我们将 Interface4 的方法进行默认实现
public abstract class AbsAdapter implements Interface4 {
  //默认实现
  public void m1() {
  }
  public void m2() {
  }
  public void m3() {
  }
  public void m4() {
  }
}


测试Client


public class Client {
  public static void main(String[] args) {
  AbsAdapter absAdapter = new AbsAdapter() {
    //只需要去覆盖我们 需要使用 接口方法
    @Override
    public void m1() {
    // TODO Auto-generated method stub
    System.out.println("使用了m1的方法");
    }
  };
  absAdapter.m1();
  }
}

1dc618a0ed9580ce8bfa6facb208c08f.png


适配器模式在SpringMVC 框架应用的源码剖析


5d4c6812c8535adbb050f4ddf2e1bce8.png


动手写 SpringMVC 通 过 适配器设计模式 获取到对应的 Controller 的源码

46a9d80a6e05e4e3b19d57a0ee70bcdf.png

Controller


//多种Controller实现  
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


///定义一个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


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...
  }
}


5d4c6812c8535adbb050f4ddf2e1bce8.png46a9d80a6e05e4e3b19d57a0ee70bcdf.png


个人感觉:这个写法太精妙了,因为各个controller方法名不同。①怎么让这些方法变成一个统一的? 于是想到用每个controller对应一个adapter实现类,这个adapter统一实现adapet接口。②如何判断传进来的controller用哪个adapt实现类?这句话白话说就是 根据controller找到对应的adapt,于是在dispatchservelt中先把所有的adapt实现来放在一个集合中,遍历,用每个adapt提供的support方法,找到自己。于是 就是可以使用这个对应的adapter干自己喜欢的事情了。!!


总结:


66ba272a0bfc97be54a5fa679e3d5482.png



相关文章
|
2月前
|
设计模式 Java API
重构旧代码的秘诀:用设计模式 - 适配器模式(Adapter)给Java项目带来新生
【4月更文挑战第7天】适配器模式是解决接口不兼容问题的结构型设计模式,通过引入适配器类实现目标接口并持有不兼容类引用,实现旧代码与新接口的协作。适用于处理兼容性问题、整合遗留代码和集成第三方库。应用时,识别不兼容接口,创建适配器类转换方法调用,然后替换原有引用。注意保持适配器简单、使用组合和考虑扩展性。过度使用可能导致系统复杂和维护成本增加,应谨慎使用。
|
2月前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
54 4
|
2月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
|
13天前
|
设计模式
适配器模式-大话设计模式
适配器模式-大话设计模式
15 2
|
1月前
|
设计模式 Java C#
【设计模式】第六篇:来康康适配器模式
类适配器模式 主要使用继承实现,耦合度高,且在单继承的语言中使用会受限,还需要防止继承带来的一些问题
20 5
|
6天前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 适配器模式
js设计模式【详解】—— 适配器模式
9 0
|
11天前
|
设计模式 Java Android开发
Java设计模式:适配器模式的三种形式(五)
Java设计模式:适配器模式的三种形式(五)
|
12天前
|
设计模式 Java
Java设计模式之适配器模式详解
Java设计模式之适配器模式详解
|
18天前
|
设计模式 程序员
结构型设计模式之适配器模式
结构型设计模式之适配器模式
|
1月前
|
设计模式 算法 关系型数据库
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
系统要求所有的数据库帮助类必须实现ISqlHelp接口,面向该接口编程,如SQLServerHelp类。 此时第三方提供了一个新的MySql的帮助类(假设是dll,不能修改),它的编程规范和ISqlHelp不兼容,这个时候就需要引入适配器类,使二者能相互兼容。
150 0