适配器模式

适配器模式

将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。简单的说就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。
适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
在业务开发中我们会经常的需要做不同接口的兼容,比如需要把各个业务线的各种类型服务做统一包装,再对外提供接口进行使用。而这在我们平常的开发中也是非常常见的。
根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。

适配器模式包含以下角色
目标抽象类:Target,该角色把其他类转换为我们期望的接口,可以是一个抽象类或接口,也可以是具体类。定义Client使用的与特定领域相关的接口
被适配者: Adaptee ,原有的接口,也是希望被适配的接口。定义一个已经存在的接口,这个接口需要适配,需要适配别人(要适配者)
适配器: Adapter, 将被适配者和目标抽象类组合到一起的类。对Adaptee的接口与Target接口进行适配

image-20231229133331870

例子

某公司欲开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示。在该公司以往的产品中已经实现了控制灯光闪烁(例如警灯闪烁)和声音提示(例如警笛音效)的程序,为了重用先前的代码并且使得汽车控制软件具有更好的灵活性和扩展性。

设计思路:通过适配器(警车)将目标类(玩具小车)与已经实现好的适配者(警灯和警灯)适配起来

警车需要实现目标类,同时带有适配者的引用

image-20231229135056393

目标抽象类

1
2
3
4
5
6
7
public abstract class CarController {
public void move(){
System.out.println("玩具汽车正在移动");
}
public abstract void phonate(); //发出声音
public abstract void twinkle(); //灯光闪烁
}

被适配者

1
2
3
4
5
public class PoilceLamp {
public void alarmLamp(){
System.out.println("警灯闪烁");
}
}
1
2
3
4
5
public class PoliceSound {
public void alarmSound(){
System.out.println("发出警笛声音");
}
}

适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class PoliceCarAdapter extends CarController{
PoliceSound policeSound;
PoilceLamp poilceLamp;

public PoliceCarAdapter() {
policeSound = new PoliceSound();
poilceLamp = new PoilceLamp();
}

@Override
public void phonate() {
policeSound.alarmSound();
}

@Override
public void twinkle() {
poilceLamp.alarmLamp();
}
}

客户端

1
2
3
4
5
6
7
8
9
public class Client {
public static void main(String[] args) {
CarController car = new PoliceCarAdapter();
car.move();
car.phonate();
car.twinkle();
}
}

优点:

  • 将目标类和适配者类解耦
  • 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
  • 可以把多个不同的适配者适配到同⼀个⽬标;同⼀个适配器可以把适配者类和它的⼦类都适配到目标接口
  • 灵活性和扩展性都非常好,符合开闭原则

缺点:

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。
  • 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

使用场景

  • 系统需要使用现有的类,而此类的接口不符合需要。
  • 需要一个统一的输出接口,而输入类型不可预知。
  • 创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(协同工作)。

双向适配器

写出猫狗的双向适配器,猫有捉老鼠catchMouse的方法,狗有bark的方法,写一个适配器,让猫能bark,狗能catchMouse

image-20240103133711113


适配器模式
http://example.com/2023/10/15/计算机基础/设计模式/06-适配器模式/
作者
PALE13
发布于
2023年10月15日
许可协议