设计模式(十四)—— 适配器模式

适配器模式

定义

讲一个类的接口变换成客户端所期待的另一种接口,从而是原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

  • Target:目标角色,该角色定义把其他类转换为何种接口,也就是我们所期望的接口。
  • Adaptee:源角色,将要转换成目标角色的角色,是已经存在的、运行良好的类或对象,经过适配器角色的包装,会成为崭新的角色。
  • Adapter:适配器角色,核心角色,其他两个角色是已经存在的角色,适配器角色是需要新建的。通过继承或是类关联的方法把源角色转换成目标角色。

模型实现

1
2
3
4
5
6
public interface Target {
/**
* 目标角色
*/
void request();
}

目标角色的实现类:

1
2
3
4
5
6
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("目标角色实现类的方法");
}
}

源角色:

1
2
3
4
5
6
7
8
9
public class Adaptee {

/**
* 原来的业务逻辑
*/
public void doSomething(){
System.out.println("源角色执行的方法");
}
}

适配器角色:

1
2
3
4
5
6
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.doSomething();
}
}

main方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {

public static void main(String[] args) {
// 原来的业务逻辑
Target target = new ConcreteTarget();
target.request();
// 增加适配器角色后的逻辑
Target target1 = new Adapter();
target1.request();
}
}
// 输出
目标角色实现类的方法
源角色执行的方法

优点

  • 增加类的透明性,客户端通过适配器可以透明地调用目标接口。
  • 提高类的复用度。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。

缺点

更换适配器的实现过程复杂。

适用场景

之前的系统存在满足新系统功能需求的类,但其接口同新系统接口不一致。

扩展

对象适配器

之前讲的是类适配器,对象适配器与类适配器的区别:类适配器是类间继承,对象适配器是对象的合成关系,也可以说是类的关联关系。由于对象适配器是通过类间的关联关系进行耦合的,因此设计时候就可以做到比较灵活,比如修补源角色隐形缺陷,关联其他对象等,而类适配器只能通过覆写源角色方法进行覆盖。

代码:Github


欢迎关注公众号:
公众号微信

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
显示 Gitment 评论