程序员的成长之路:设计模式:适配器模式
来源:互联网 发布:零基础php好学吗 编辑:程序博客网 时间:2024/06/06 14:41
适配器模式
将一个类的接口转换成客户希望的另外一个接口。使得不兼容的两个类可以一起工作.
在实际开发中,我们实现某一需求经,会发现项目中已经有一个满足需求的类,但是这个类与我们希望的接口不兼容,这个时候我们就可以使用适配器模式.
场景:一个已有的项目中,其日志记录的实现方式是保存txt文件,而客户希望提供xml的方式,以后很可能也需要持久化到数据库的方式,由于txt的方式已经实现了,基于OCP原则,我们不应该因为改变而修改txt类的实现,我们可以使用适配器模式,设计一个适配器,来适配不同的日志方式.
适配器模式的实现方式有很多种,其目的就是使得两个不兼容的类可以一起工作.
基于类的适配
1 创建一个xml日志的接口,抽象xml日志方法
2 创建一个适配器类,实现已有类和xml日志接口,并实现xml日志方法
这样适配器就可以同时支持 txt和xml的日志操作,但是java是单继承多实现的,如果xml和txt都已经实现,需要添加数据库的日志方式,那怎么办呢
基于对象的适配
1 创建一个适配器接口,抽象所有源对象的方法,即 txt xml 的日志操作方法
2 创建适配器实现类,持有所有源对象,即 Adapter中添加成员变量 xmlLog dbLog txtLog
3 与源对象相关的方法中,返回所持有源对象对应方法的结果 即 xmlLog() return this.xmlLog.xmllog()
4 添加并实现数据库日志操作方法
SpringMVC的适配
1 创建适配器接口,提供2个方法
supprots(Handler handler) 用于判断handler是否指定的类型.
handler(Handler handler) 用于执行对应handler中的方法
2 实现多个适配器,1个适配器对应一个处理器(Handler)
3 调用类
// 创建一个适配器链,用于存放适配器
// 创建处理器
// 遍历适配器链,调用supprots(handler)方法
// 如果为true 则返回适配器
// 调用适配器的handler来执行处理器
public class AdapterMain { // 创建一个适配器链,用于存放适配器 private final static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>(); public static void main(String[] args) { handlerAdapters.add(new HttpAdapter()); handlerAdapters.add(new AnnotationAdapter()); handlerAdapters.add(new SimpleAdapter()); // 方便测试:创建一个集合存放所有处理器,并随机创建一个controller类 for (int i = 0; i < 10; i++) { List<Handler> handlers = new ArrayList<Handler>(); handlers.add(new HttpController()); handlers.add(new SimpleController()); handlers.add(new AnnotationController()); Random random = new Random(); int next = random.nextInt(3); Handler handler = handlers.get(next); HandlerAdapter adapter = adapter(handler); if (adapter != null) { adapter.handle(handler); } } } // 执行适配的方法 public static HandlerAdapter adapter(Object handler) { // 遍历适配器链 for (HandlerAdapter adapter : handlerAdapters) { // 判断是否与处理器适配 if (adapter.supports(handler)) { // 适配成功,返回适配器 return adapter; } } // 适配失败,返回null return null; }}
/** * 适配器接口 * @explain * @author Created by Vision Ho 2017年3月21日 */public interface HandlerAdapter { /** * 用于执行与适配器对应的处理器类的方法 * @param handler * @author Vision */ public void handle(Object handler); /** * 用于判断handler(controller)是否适配器所对应的类型 * @param handler * @return * @author Vision */ public boolean supports(Object handler);}
public class SimpleAdapter implements HandlerAdapter { @Override public void handle(Object handler) { ((SimpleController) handler).doSimplerHandler(); } @Override public boolean supports(Object handler) { return (handler instanceof SimpleController); }}
public class AnnotationAdapter implements HandlerAdapter { @Override public void handle(Object handler) { ((AnnotationController) handler).doAnnotationHandler(); } @Override public boolean supports(Object handler) { return (handler instanceof AnnotationController); }}
public class HttpAdapter implements HandlerAdapter { @Override public void handle(Object handler) { ((HttpController)handler).doHttpHandler(); } @Override public boolean supports(Object handler) { return (handler instanceof HttpController); } }
public interface Handler {}
public class SimpleController implements Handler { public void doSimplerHandler() { System.out.println("simple..."); }}
public class HttpController implements Handler { public void doHttpHandler() { System.out.println("http..."); }}
public class AnnotationController implements Handler { public void doAnnotationHandler() { System.out.println("annotation..."); }}
- 程序员的成长之路:设计模式:适配器模式
- 设计模式之适配器模式的图解
- 设计模式学习之路-适配器模式
- 设计模式之适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式 之 适配器
- 设计模式 之 适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式之适配器
- 设计模式 之 适配器模式
- 设计模式之适配器模式
- 设计模式之适配器模式
- 设计模式之适配器模式
- PL/SQL 之三 游标基础用法
- @Resouce @Autowired 区别
- C++类访问另一个类的私有成员和保护成员
- Bootstrap 表单和图片
- linux安装jdk和tomcat+环境变量配置
- 程序员的成长之路:设计模式:适配器模式
- 如何使Qt应用程序不在系统的任务栏上显示?
- 对python脚本传参数
- Mword单词记忆小助手
- Linux命令小知识
- 【剑指offer Java】面试题6:重建二叉树
- L1-009. N个数求和
- 笔试题-奇数位丢弃
- web请求响应规范化处理