程序员的成长之路:设计模式:适配器模式
2017-03-21 23:24
337 查看
适配器模式
将一个类的接口转换成客户希望的另外一个接口。使得不兼容的两个类可以一起工作.
在实际开发中,我们实现某一需求经,会发现项目中已经有一个满足需求的类,但是这个类与我们希望的接口不兼容,这个时候我们就可以使用适配器模式.
场景:一个已有的项目中,其日志记录的实现方式是保存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来执行处理器
/**
* 适配器接口
* @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);
}
}
将一个类的接口转换成客户希望的另外一个接口。使得不兼容的两个类可以一起工作.
在实际开发中,我们实现某一需求经,会发现项目中已经有一个满足需求的类,但是这个类与我们希望的接口不兼容,这个时候我们就可以使用适配器模式.
场景:一个已有的项目中,其日志记录的实现方式是保存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 p ae7d ublic 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..."); } }
相关文章推荐
- 软件设计师之路-----设计模式之接口型设计模式1-------适配器模式
- 设计模式学习之路 - 适配器模式 - 接口转换器
- java学习之路--设计模式--适配器模式
- 设计模式学习之路 - 序言 - 记录自己的成长历程
- 资深程序员之路(3)--设计模式与UML class图
- 设计模式学习之路-适配器模式
- 设计模式1-适配器模式(Adapter)
- 23种经典设计模式的java实现_2_适配器模式
- 程序员的成长故事之 五年技术之路
- 设计模式与泡mm的关系之Adapter适配器模式及适配器模式的再思考
- Java设计模式之适配器模式
- .NET设计模式-适配器模式(Adapter Pattern)
- .NET设计模式(8):适配器模式(Adapter Pattern)
- 深入浅出Java设计模式之适配器模式
- 设计模式学习(七)适配器模式
- 结构型设计模式---Adapter模式(适配器模式)
- 23种经典设计模式的java实现_2_适配器模式
- 设计模式(7)-适配器模式(Adapter)
- Dot Net设计模式—适配器模式
- 深入浅出Java设计模式之适配器模式