您的位置 首页 > 数码极客

【适配器的作用】一篇文章搞懂程序设计模式中的适配器模式

相关概念:

适配器模式:将一个类的接口转换为客户需要的另一个接口。

Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作(选自: 《大话设计模式》)

适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。(选自:Java设计模式之《适配器模式》及应用场景)

适配器的主要作用是在新接口和老接口之间进行适配

应用场景:

①想使用一个已存在的类,但是该类不符合接口需求;

②需要创建一个可重用的类,适配没有提供合适接口的其他类。

③如果一个类要实现一个具有很多抽象方法的接口,但是本身只需要实现接口中的部分方法便可以达成目的,所以此时就需要一个中间的过渡类,但此过渡类又不希望直接使用,所以将此类定义为抽象类最为合适,再让以后的子类直接继承该抽象类便可选择性的覆写所需要的方法,而此抽象类便是适配器类。(不想实现接口中的所有方法)

适配器模式分类

模式所涉及的角色有:

● 目标(Target)角色:这就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。

● 源(Adapee)角色:现在需要适配的接口。

● 适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。

①类适配器模式:

解释: 在上图中可以看出,Adaptee类并没有Request()方法,而客户端Client则期待这个方法。为使客户端Client能够使用Adaptee类,提供一个中间环节,即类Adapter,把Adaptee的API与Target类的API衔接起来。Adapter与Adaptee是继承关系,这决定了这个适配器模式是类适配器。

代码:

客户端期待调用的接口

需要适配的方法

通过继承待适配的类Adaptee,同时实现Target接口来重写request()

创建一个适配器,调用适配器的request方法,实际最后调用的是specificRequest()

①对象适配器模式:

解释:从上图可以看出,Adaptee类并没有Request()方法,而客户端则期待这个方法。为使客户端能够使用Adaptee类,需要提供一个包装(Wrapper)类Adapter。这个包装类包装了一个Adaptee的实例,从而此包装类能够把Adaptee的API与Target类的API衔接起来。Adapter与Adaptee是委派关系,这决定了适配器模式是对象适配器。

代码:

客户端期待调用的接口

需要适配的方法

适配器类,通过包装了一个Adaptee实例来调用specificRequest()

创建一个适配器,并传入一个需要适配的类的实例,然后调用适配器重写的方法request()

总结:

区别:对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。

优点:

复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。

扩展性:在实现适配器功能的时候,可以自由调用自己开发的功能,从而自然地扩展系统的功能。

缺点:

过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现。所以适配器模式不适合在详细设计阶段使用它,它是一种补偿模式,专用来在系统后期扩展、修改时所用。

适用场景:

1、已经存在的类的接口不符合我们的需求;

2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类协同工作;

3、使用一些已经存在的子类而不需要对其进行子类化来匹配接口。

4、旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。

注意:

适配器模式不适合在详细设计阶段使用它,它是一种补偿模式,专用来在系统后期扩展、修改时所用,适配器模式更像是一种补救措施。

参考文献:《大话设计模式》 微信公众号:《Java知音》 博客园文章:《设计模式:适配器模式》《JAVA与模式》之适配器模式

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐