前言
适配器(Adapter)模式是属于结构型设计模式当中的一种,它是将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
以现实生活中的案例举例:电源适配器。就是适配器模式的一种表现。我们生活用电一般是220V,而一般电器是不需要那么大的输出功率。比如电脑,为了能够正常给电脑供电,所以设计出了电源适配器做一个中间转换。
用软件系统的角度来解读就是:有a、b两个系统。a系统有某些业务或者功能能力是b系统所需要的,但是b系统原有接口又兼容不了a系统。所以为了适配这两个系统,需要建立一个适配器的角色来使b系统能调用a系统
一、适配器模式
适配器模式的结构角色定义分别为:
- 目标(Target)接口:当前业务系统,一般为抽象类或者接口类
- 适配者(Adaptee)类:期望被访问的接口,一般是需要被调用的业务系统
- 适配器(Adapter)类:它是一个转换器,一般通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
结构图示(来源网络):
用通俗的话来解释上面这张图:target作为调用方,adaptee作为期望被调用方。adapter作为中间转换方,它继承或者实现于target调用方,且它持有adaptee期望方的引用。这样就相当于把期望方和调用方关联起来。此时你的业务逻辑就可以通过调用adapter类来调用期望想调用的adaptee接口。
二、适配器模式使用
其实适配器模式在我们平时开发中经常会用到。举个例子:当我们业务逻辑有需要接入第三方组件或者调用第三方系统接口的情况下,我们一般的选择,是会单独建立一个接口,用此接口来对接第三方系统的接口,然后业务逻辑中再调用我们自己建立的接口。而不是直接在业务逻辑中去调用第三方系统接口。
上面这个举例在调用行为上跟适配器模式是一样的,可以当成适配器模式运用的解读
适配器模式(Adapter)通常适用于以下场景。
- 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
- 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。
代码演示
根据模式的角色来定义相关的接口和类
目标(Target)接口:
Target既可以是接口也可以是抽象类。以往举例用的都是interface,这里使用抽象类举例。
package com.example.study.adapter;
public abstract class Target {
abstract void request();
}
适配者(Adaptee)接口:
package com.example.study.adapter;
public interface Adaptee {
void adapteeRequest();
}
//适配者实现类
package com.example.study.adapter;
public class AdapteeDemoImpl implements Adaptee{
@Override
public void adapteeRequest() {
System.out.println("第三方系统被调用");
}
}
适配器(Adapter)类:
package com.example.study.adapter;
//继承或实现target接口。
public class Adapter extends Target{
//持有适配者接口引用
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
//转换调用,调用适配者类接口
@Override
void request() {
adaptee.adapteeRequest();
}
}
业务逻辑(客户端):
package com.example.study.adapter;
public class BusinessClient {
public static void main(String[] args) {
//BusinessClient相当于业务逻辑,现在需要调用第三方系统提供的能力,通过适配器类去调用。
//Target目标接口,BusinessClient通过调用目标接口来达到调用第三方系统的效果
Target target = getAdapter();
target.request();
}
/**
* 对业务逻辑屏蔽调用细节
* @return
*/
static Target getAdapter(){
Adaptee adaptee = new AdapteeDemoImpl();
Target target = new Adapter(adaptee);
return target;
}
}
结果展示:
总结
上面的代码展示是单向的适配,即只为b系统适配调用a系统。如果反过来a系统也要调用b系统呢,是不是可以来个双向奔赴,整个双向适配呢。
很简单,单向适配的原理是通过适配器类实现target接口并持有适配者接口的引用实现。双向适配则是一样的道理:适配器类除了实现target接口,还需实现适配者接口。且除了持有适配者接口引用,还持有target接口引用。这样就能做到相互调用。双向适配。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99033.html