设计模式之适配器模式

什么是适配器模式

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

适配器的概念其实非常容易理解,生活中有很多适配器的例子,各种各样的转接设备,很常见也很实用。而程序中的适配器也是这样,同样也是起到一个转接的作用。

举个栗子

适配器模式中一共有三种角色:目标角色、源角色和适配器角色,下面编码来感受一下

  • 目标角色及实现
1
2
3
4
5
6
7
8
9
10
public interface Target {
//目标角色的方法
public void request();
}
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("Target");
}
}
  • 源角色
1
2
3
4
5
6
public class Adaptee {
//源角色方法
public void specificRequest(){
System.out.println("Adaptee");
}
}
  • 适配器
1
2
3
4
5
6
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.specificRequest();
}
}
  • 应用场景
1
2
3
4
5
6
7
8
9
public class Client {
public static void main(String[] args) {
Target target;
target = new ConcreteTarget();
target.request();
target = new Adapter();
target.request();
}
}

输出结果

1
2
Target
Adaptee

上面的例子可以看出来,经过适配器处理之后,同样是调用目标角色的接口,却能实现源角色的功能,这样就实现了功能的适配。

适用范围

适用范围也很容易理解,和现实中的场景也一样,新功能旧功能之间,或者两个不兼容的系统之间无法共存,就可以通过适配器模式来实现。

优点缺点

适配器模式优点很多,首先是它可以使不相关的类之间建立联系,并且能够运行在一起,增加了类的复用度和透明度,而且它作为独立的一部分增加和删除都不会对原系统产生影响,扩展很安全。

注意事项

到此,适配器模式其实还没有结束。考虑到实际场景中,通常需要适配的源角色往往不是只有一个,由于java语言不支持多继承,此时采用上面的模式就力不从心了,难道这样就没办法适配了吗?当然不是,上限介绍的其实只是适配器模式的一种,叫做类适配器,是通过继承的方式实现的。而还有一种通过组合来实现的适配器,叫做对象适配器。

对象适配器

先画一个模型图

其中目标角色的编码和上面相同,下面是其他部分编码

  • 源角色
1
2
3
4
5
6
7
8
9
10
11
12
public class Adaptee1 {
//源角色方法
public void specificRequest(){
System.out.println("Adaptee1");
}
}
public class Adaptee2 {
//源角色方法
public void specificRequest(){
System.out.println("Adaptee2");
}
}
  • 适配器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Adapter implements Target {
//源角色对象
private Adaptee1 adaptee1;
private Adaptee2 adaptee2;
public Adapter(Adaptee1 adaptee1, Adaptee2 adaptee2) {
this.adaptee1 = adaptee1;
this.adaptee2 = adaptee2;
}
@Override
public void request() {
adaptee1.specificRequest();
adaptee2.specificRequest();
}
}
  • 应用场景
1
2
3
4
5
6
7
8
9
public class Client {
public static void main(String[] args) {
Target target;
target = new ConcreteTarget();
target.request();
target = new Adapter(new Adaptee1(), new Adaptee2());
target.request();
}
}

输出结果

1
2
3
Target
Adaptee1
Adaptee2

这样就可以实现针对多个适配源的适配,对象适配器没有那么多的局限性,但是不容易扩展。不过要记住,适配器模式本身就是一种补救的设计模式,在实际应用中往往是为了解决一些不可避免的特定需求而存在的,正确使用才能用好这种设计模式。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!