程序员的成长之路:设计模式:适配器模式

来源:互联网 发布:零基础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...");    }}





0 0
原创粉丝点击