资讯专栏INFORMATION COLUMN

设计模式学习笔记:适配器模式

CompileYouth / 2586人阅读

摘要:二适配器模式概念适配器模式是一种结构型模式,它的思想是将一个接口转化为另一个接口。适配器模式包含四个角色对象定义所需要的方法请求者负责使用对象定义的方法来做具体的处理被适配者以持有方法的角色适配器使用被适配者的方法来满足对象的需要。

一、结构型设计模式

1、概念
结构型设计模式描述如何将类或者对象结合在一起形成更为复杂,功能更为强大的结构。

2、分类
(1)类结构模型:这种结构模型关心类的组合,类直接组合成一个更大的系统,通常用继承来建立这种关系。
(2)对象结构模型:这种模型结构关心类与对象的组合,通常在一个类中使用另一个类的对象,再调用其方法。

注:“合成复用原则”规定尽量用关联关系来代替继承关系,因此一般使用对象结构模型。

二、适配器模式

1、概念
适配器模式是一种结构型模式,它的思想是将一个接口转化为另一个接口。
适配器模式包含四个角色:
(1)对象:定义所需要的方法
(2)请求者:负责使用对象定义的方法来做具体的处理
(3)被适配者:以持有方法的角色
(4)适配器:使用被适配者的方法来满足对象的需要。

2、代码示例:使用安卓充电器给苹果充电
(1)安卓和苹果充电器接口

//安卓
public interface MicroUsbInterface {
    public void chargeWithMicroUsb();
}

//苹果
public interface LightningInterface {
    public void chargeWithLightning();
}

(2)安卓设备充电器

public class AndroidCharger implements MicroUsbInterface {
    @Override
    public void chargeWithMicroUsb() {
        System.out.println("使用MicroUsb型号的充电器充电...");
    }
}

(3)适配器(用安卓充电器适配苹果充电器)

public class Adapter implements LightningInterface {
    //将安卓充电器的接口作为一个字段
    private MicroUsbInterface microUsbInterface;

    public Adapter() {
    }

    public Adapter(MicroUsbInterface microUsbInterface) {
        this.microUsbInterface = microUsbInterface;
    }

    @Override
    public void chargeWithLightning() {
        //使用安卓充电器给苹果设备充电
        microUsbInterface.chargeWithMicroUsb();
    }

    public MicroUsbInterface getMicroUsbInterface() {
        return microUsbInterface;
    }

    public void setMicroUsbInterface(MicroUsbInterface microUsbInterface) {
        this.microUsbInterface = microUsbInterface;
    }
}

在这个示例中,对象就是给苹果手机充电,请求者就是苹果手机,被适配者是安卓充电器,适配器是用安卓充电器给苹果手机充电的适配器。

3、适用场景
(1)系统想要使用现有类,但这个类的接口不符合系统需要

(2)想要建立一个可以重复使用的类,用在一些没有关联的类之间

(3)通过接口转换将一个类插到另一个类系当中。(比如新增一个飞狗类,就可以实现飞的接口,并且增加一个狗字段)

4、优缺点
(1)优点:将目标和被适配者解耦,通过适配器来关联,同时具有透明性、复用性、灵活性和扩展性

(2)缺点:过度的使用适配器会让系统显得比较凌乱。

三、适配器应用

1、SpringMVC的HandleAdapter使用了适配器模式的思想

SpringMVC中的handler(Controller,HttpRequestHandler,Servlet)的实现方式是多重的,可以是继承controller的,也可能是注解控制器方式的。
因此如果是正常的调用,需要通过if else语句去判断,这样就会破坏开闭原则。

为了解决这个问题,Spring定义了一个适配接口,使得每一个handler都有一种对应的适配器实现类, 让适配器代替handler执行相应的方法。这样在扩展Controller 时,只需要增加一个适配器类就完成了SpringMVC的扩展了。

//定义一个Adapter接口  
public interface HandlerAdapter {  
    public boolean supports(Object handler);  
    public void handle(Object handler);  
}  
这是一段模拟的代码
//以下是三种Controller实现  
public interface Controller {  

}  
//HTTP请求处理器
public class HttpController implements Controller{  
    public void doHttpHandler(){  
        System.out.println("http...");  
    }  
}  
//继承Controller方式
public class SimpleController implements Controller{  
    public void doSimplerHandler(){  
        System.out.println("simple...");  
    }  
}  

//注解方式
public class AnnotationController implements Controller{  
    public void doAnnotationHandler(){  
        System.out.println("annotation...");  
    }  
}  


//下面编写适配器类  

public class SimpleHandlerAdapter implements HandlerAdapter {  
    public void handle(Object handler) {  
        ((SimpleController)handler).doSimplerHandler();  
    }  

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

}  


public class HttpHandlerAdapter implements HandlerAdapter {  

    public void handle(Object handler) {  
        ((HttpController)handler).doHttpHandler();  
    }  

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

}  

public class AnnotationHandlerAdapter implements HandlerAdapter {  

    public void handle(Object handler) {  
        ((AnnotationController)handler).doAnnotationHandler();  
    }  

    public boolean supports(Object handler) {  

        return (handler instanceof AnnotationController);  
    }  

}  


//模拟一个DispatcherServlet  
import java.util.ArrayList;  
import java.util.List;  

public class DispatchServlet {  

    public static List handlerAdapters = new ArrayList();   

    public DispatchServlet(){  
        handlerAdapters.add(new AnnotationHandlerAdapter());  
        handlerAdapters.add(new HttpHandlerAdapter());  
        handlerAdapters.add(new SimpleHandlerAdapter());  
    }  


    public void doDispatch(){  

       //此处模拟SpringMVC从request取handler的对象,仅仅new出,可以出,               
       //不论实现何种Controller,适配器总能经过适配以后得到想要的结果  
       //HttpController controller = new HttpController();  
       //AnnotationController controller = new AnnotationController();  
        SimpleController controller = new SimpleController();  
        //得到对应适配器  
        HandlerAdapter adapter = getHandler(controller);  
        //通过适配器执行对应的controller对应方法  
        adapter.handle(controller);  
    }  

//遍历注入的handleradapter找到合适的适配器子类
    public HandlerAdapter getHandler(Controller controller){  
        for(HandlerAdapter adapter: this.handlerAdapters){  
            if(adapter.supports(controller)){  
                return adapter;  
            }  
        }  
        return null;  
    }  

    public static void main(String[] args){  
        new DispatchServlet().doDispatch();  
    }  

}  
 

参考:看springmvc适配器模式---HandlerAdapter https://blog.csdn.net/a362212...
设计模式(十一)——适配器模式
https://www.hollischuang.com/...
《图解设计模式》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75214.html

相关文章

  • 慕课网_《模式的秘密之配器模式学习总结

    摘要:时间年月日星期二说明本文部分内容均来自慕课网。慕课网教学源码学习源码第一章适配器模式的简介简介生活中的适配器翻译软件插座适配器适配器模式定义适配器模式讲将一个类的接口,转换成客户期望的另外一个接口。 时间:2017年08月29日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s.....

    andong777 评论0 收藏0
  • Backbone.js学习笔记(一)

    摘要:它通过数据模型进行键值绑定及事件处理,通过模型集合器提供一套丰富的用于枚举功能,通过视图来进行事件处理及与现有的通过接口进行交互。 本人兼职前端付费技术顾问,如需帮助请加本人微信hawx1993或QQ345823102,非诚勿扰 1.为初学前端而不知道怎么做项目的你指导 2.指导并扎实你的JavaScript基础 3.帮你准备面试并提供相关指导性意见 4.为你的前端之路提供极具建设性的...

    FrancisSoung 评论0 收藏0
  • (CZ深入浅出Java基础)设计模式笔记

    摘要:在设计模式中,所有的设计模式都遵循这一原则。其实就是说在应用程序中,所有的类如果使用或依赖于其他的类,则应该依赖这些其他类的抽象类,而不是这些其他类的具体类。使用设计模式是为了可重用代码让代码更容易被他人理解保证代码可靠性。 这是刘意老师的JAVA基础教程的笔记讲的贼好,附上传送门 传智风清扬-超全面的Java基础 一、面向对象思想设计原则 1.单一职责原则 其实就是开发人员经常说的高...

    李昌杰 评论0 收藏0
  • JavaScript 设计模式读书笔记(七)——配器模式

    摘要:与门面模式的联系本文要说的适配器模式和上一篇门面模式在思想上有相似之处,所以放在一起说。我们以中的一个为例,说说实际应用中的适配器模式的使用方法。而如果实现层的问题不大,要解决一部分适配问题的话,适配器模式就是很好的选择了。 与门面模式的联系 本文要说的适配器模式和上一篇门面模式在思想上有相似之处,所以放在一起说。它们都对类的接口进行了一些改变。门面模式是把相似的或是完成相关任务的接...

    AZmake 评论0 收藏0
  • Java设计模式学习总结

    摘要:的设计模式世界顶级足球射门锦集。重构敏捷软件开发设计模式解析一场场最精彩的足球比赛。但不属于种设计模式之一。代理设计模式代理模式,为其他对象提供一种代理以控制对这个对象的访问。 前言 编程是一门技术,更是一门艺术。如果想成为一名更优秀的软件设计师,了解优秀软件设计的演变过程比学习优秀设计本身更有价值,因为设计的演变过程中蕴藏着大智慧。学习设计模式,重要的不是你将来会不会用得到这些模式,...

    songze 评论0 收藏0

发表评论

0条评论

CompileYouth

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<