设计模式|适配器模式使用案例、适配器模式在源码中的应用

目录

适配器模式概括

适配器模式使用案例

适配器模式在开源框架中的应用


适配器模式概括

将一个类的接口转换为客户期望的另一个接口。适配器模式不是软件设计阶段考虑的模式,而是软件维护时要用到的模式。

适配器优点:1.能提高类的透明性和复用性,现有类的复用但不需要改变;2.目标类和适配器类解耦合,提高程序扩展性;3.符合开闭原则。

适配器缺点:适配器模式编写过程中需要全面的考虑,可能会增加系统的复杂性,代码更难读懂。

适配器模式的适用场景:新增业务对原有业务的改造。例如家用插座提高220V的电流,用作给电视冰箱、电视供电。新买的手机只能冲5V的电流,插座直冲显然不合适,这时候可以使用一个充电头将220V电转为5v电。

适配器模式使用案例

原有类

public class AC220 {
    public int outPut(){
        int AC220 = 200;
        System.out.println("输出"+AC220+"V");
        return  AC220;
    }
}

给客户提供的接口

public interface DC5 {
    public  static  int DC5 = 5;
    public int output();
}

适配类及测试方法

public class PowerAdapter extends AC220 implements DC5 {
    private AC220 ac220 = new AC220();
    @Override
    public int output() {
        int originalNum = ac220.outPut();
        //简化的转换器,目的是输出5V电流
        int resultNum = originalNum/44;
        System.out.println("适配器转换后的电压"+resultNum+"V");
        return resultNum;
    }
    public static void main(String[] args) {
        DC5 adapter = new PowerAdapter();
        adapter.output();
    }
}

这段代码很容易读懂,注意在DC5接口的时候其实是实例化了新写的适配器类。符合了适配器设计模式的适用场景。在不改变原有接口的情况下将接口转换为客户期望的另一个接口。

适配器模式在开源框架中的应用

位于org.springframework.web.servlet包中的DispatcherServlet是servlet接口的实现类,作用是处理请求并返回结果。在servlet容器接收到一个请求时,servlet容器会针对这个请求创建一个servletRequest和servletRespones对象,相应的处理方法会通过servletRequest中携带的参数对应处理请求,再通过servletRespones对象商城请求的响应结果。

DispatcherServlet类的doDispatch方法是处理请求的核心逻辑,截取部分内容如下

try {
    //对请求做类型转换
    processedRequest = checkMultipart(request);
    multipartRequestParsed = (processedRequest != request);

    // 根据请求信息找到相应的Handler
    mappedHandler = getHandler(processedRequest);
    if (mappedHandler == null) {
        noHandlerFound(processedRequest, response);
        return;
    }

    // 根据handleru想你找相应的HandlerAdapter
    HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

}

doDispatch方法就是客户的逻辑方法,HandlerAdapter是客户使用的接口,getHandlerAdapter方法就是找到一个和当前请求匹配的适配器类,找到getHandlerAdapter方法

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
    if (this.handlerAdapters != null) {
        for (HandlerAdapter adapter : this.handlerAdapters) {
            if (adapter.supports(handler)) {
                return adapter;
            }
        }
    }
}

getHandlerAdapter业务逻辑就是遍历所有的适配器来找到合适的适配器并返回,而某个适配器是否适用于当前的handler的判断逻辑封装在了具体适配器中。找HandlerAdapter类的继承类(快捷键ctrl+H)列表,这个列表中的类就是所有的适配器类

打开SimpleControllerHandlerAdapter这个类的supports来看一下

public boolean supports(Object handler) {
		return (handler instanceof Controller);
}

可以看出来只要handler属于Controller类型,就会返回SimpleControllerHandlerAdapter这个类。所以SimpleControllerHandlerAdapter这个类就是来处理普通的web请求的,我们常写的请求处理类上都会加一个@Controller注解,目的就是能被视为一个请求处理类。

此处适用适配器模式提高了处理请求的灵活性,如果没有支持适配器模式的话,要写很多if-else代码去判断类型,如果新加了处理类型还要修改源码,不符合开闭原则。

开源框架中使用了适配器模式的地方很多,除了介绍的实例外,还有处理对象和XML格式转化的XmlAdapter、处理通知的AdvisorAdapter、jpa中处理数据源的JpaVendorAdapter。内容较易读,可以结合适配器的特点进行分析、学习。


                                                  文辞粗浅,不当之处请指教,如果觉得文章不错,请关注或点赞  (-__-)谢谢

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
内容简介: 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 本课程内容定位学习设计原则,学习设计模式的基础。在实际开发过程,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。本章将详细介绍开闭原则(OCP)、依赖倒置原则(DIP)、单一职责原则(SRP)、接口隔离原则(ISP)、迪米特法则(LoD)、里氏替换原则(LSP)、合成复用原则(CARP)的具体内容。 为什么需要学习这门课程? 你在日常的开发,会不会也遇到过同样的问题。系统出现问题,不知道问题究竟出在什么位置;当遇到产品需求,总是对代码缝缝补补,不能很快的去解决。而且平时工作,总喜欢把代码堆在一起,出现问题时,不知道如何下手,工作效率很低,而且自己的能力也得不到提升。而这些都源于一个问题,那就是软件设计没做好。这门课能帮助你很好的认识设计模式,让你的能力得到提升。课程大纲: 为了让大家快速系统了解设计模式知识全貌,我为您总结了思维导图,帮您梳理学习重点,建议收藏!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值