设计模式之适配器模式

概念定义
1
2
3
4
5
6
菜鸟教程定义:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合
了两个独立接口的功能。
场景:
将旧的接口适配成新的接口:当系统中使用的旧接口与新的业务需求不兼容时(比如需要新增一些旧系统没有的功能),可以使用适配器模式将旧接口适配成新的接口,使得旧接口可以与新的业务需求协同工作。
复用已有的类:当一个已有的类提供的接口与当前需要的接口不匹配时,可以使用适配器模式将该类适配成满足需求的接口,从而复用该类的功能。
统一多个类的接口:当系统中存在多个类的接口不一致,而客户端需要统一调用它们的接口时,可以使用适配器模式将这些类的接口适配成统一的接口,使得客户端可以一致地操作这些类。
代码实现
  1. 适配器模式的代码理解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.jw.cloud.modulepattern.adaptee;

/**
* 要用一个自己当前实现了的方法 去实现另一个类的方法 这个模式的作用是,是将原本不能在一起使用的类可以在一起使用。
* 分模块时,我需要调用公共模块的一个功能方法时候 我需要自己写一个接口去调用公共模块的接口功能:
* 案例: 我们公司的一个公共模块有一个关于报文记录的一个方法,但是由于每个模块对接的系统不同需要实现不同的定制化的功能,
* 但是具体的实现逻辑又是一样的,所以我设计了一个适配器模式,让我们单独每个模块的目标类去调用公共模块的的日志方法,
* 在公共模块的调用上,又给自己的日志记录新增了一些特有的功能;
* 简单的理论基础是 想要实现A的功能,但是呢,你又需要一些特殊的功能去新增,所以就不能直接通过A的对象来调用a的方法,
* 需要通过B中的b方法实现你需要的一些新功能,然后在调用a的方法,这样就完成了一个适配器的功能
* 那么此时就需要b的方法里面含有a对象,这样就可以了;
* @author JoyWu
*/
public class AdapteeClient {
public static void main(String[] args) {
// 相当于原来就有的一个旧功能
Adaptee adaptee = new Adaptee();
// 我希望实现的一个接口,通过这个接口去实现新的功能
Target target = new Adapter(adaptee);
// 实现新功能+老功能
target.adapteeVideo();
}
}
  1. 被适配类,相当于旧功能
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.jw.cloud.modulepattern.adaptee;

/**
* 需要被适配的类 可以想象为老系统的一些旧功能,我们的目标是改造老系统的功能且不破坏的老系统的功能
* 就是这个功能需要被实现 可以假想为这是一个video 方法是实现我在播放video格式的东西
* @author JoyWu
*/
public class Adaptee{
public void videoPlay() {
System.out.println("我是老系统,我可以实现视频的播放");
}
}

  1. 目标接口,这就是我们现在需要实现的接口,让这个接口和老系统的东西能衔接上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.jw.cloud.modulepattern.adaptee;

/**
* 目标接口 就是我要用这个接口的实现类去实现另外的方法 通俗点可以理解为 MP3格式播放器
* @author JoyWu
*/
public interface Target {
/**
* 要去适配video的播放格式
*/
void adapteeVideo();
/**
* 该接口本身需要实现的方法
*/
void mp3();
}
  1. 目标类,去实现目标接口的方法,完成与老系统的衔接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.jw.cloud.modulepattern.adaptee;

/**
* 适配器类 目标实现类,这个类实现了目标接口,也就是要通过这个类去给老系统的新增一些新功能(在不改变原有功能的基础上)
* @author JoyWu
*/
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}

@Override
public void adapteeVideo() {
// todo 1.实现一些新的功能
System.out.println("我这是新模块的新功能呦");
// 2.实现老系统中必须的一些功能
adaptee.videoPlay();
}

@Override
public void mp3() {

}
}

运行结果

从下图的运行结果可以看出,我们没有破坏旧系统的代码逻辑,适配了些新功能上去。
适配器模式.png

总结

适配器模式是一种结构型设计模式,它用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式允许不兼容的类能够协同工作,通过将一个类的接口包装在另一个类中,从而使两个不兼容的接口能够相互配合。