1、定义
适配器模式在java中是一中结构型设计模式。
在实际的java来发中,有时候我们会遇到一些不能直接调用,或者不是客户需要的接口,但是却需要使用时,我们就可以使用适配器设计模式。
适配器设计模式就是将一个原本不兼容的接口通过转换或者适配成我们想要的接口,使原本两个不相关接口可以在一起工作。
2、角色分析
在改设计模式中,总共可以分为三个角色。
需要适配的类(Adaptee):需要适配的类或适配者类。
目标接口:客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。(其实就是我们需要适配的接口)
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
3、实现方式
1).类适配器(采用继承实现)
2).对象适配器(采用对象组合方式实现)
4、类适配器
类适配器是通过继承类和实现接口来完成的,因此叫类适配器。
实例:
以type-c接口听歌为例。
假设我们有一部手机(type-c接口),一个耳机(圆孔),这时候我们需要一个中间的type-c 转换器才可以听歌,
1)首先我们有一部手机,可以播放音乐听歌,但是它不能直接出入耳机
// 需要适配的类:
public class Phone {
public void playMusic() {
System.out.println("播放音乐中");
}
}
2)然后我们需要一个转换器,也就是type-c的转接口(也就是我们上面说的目标接口)
// 目标接口
public interface TypeC {
/**
* 处理转换器
*/
void handleTypeC();
}
3)再定义一个适配器继承手机,连接转换器。
/**
* @Description: 适配器
* @ClassName: Adapter
* @Author: weisn
* @Date: 2023/3/9 10:29
* @Version: 1.0
*/
public class Adapter extends Phone implements TypeC {
/**
* 处理转换器
*/
public void handleTypeC() {
System.out.println("处理器转换中");
// 可以听音乐了
super.playMusic();
}
}
4)东西都备齐了,但是还需要一个动作,那就是将转换器(type-c)插到手机上,当然,这一步就需要人去实现了。
public class Person {
// 这个人准备用耳机听歌,他需要一个type-c转换器
public void listenToMusic(TypeC typeC) {
System.out.println("准备开始听音乐");
typeC.handleTypeC();
}
public static void main(String[] args) {
// 人想听歌,需要一个适配器
Person person = new Person();
Adapter adapter = new Adapter();
// 实现听歌
person.listenToMusic(adapter);
}
}
运行结果
5、对象适配器
对象适配不是使用多继承或者继承实现接口的方式实现,而是使用直接关联引用的方式。
1) 更改适配器代码如下:
public class Adapter1 implements TypeC {
private Phone phone;
// 构造方式初始化具体的类
public Adapter1(Phone phone) {
this.phone = phone;
}
/**
* 处理转换器
*/
public void handleTypeC() {
System.out.println("处理器转换中");
// 可以听音乐了
phone.playMusic();
}
}
2)具体实现和使用
public class Person {
// 这个人准备用耳机听歌,他需要一个type-c转换器
public void listenToMusic(TypeC typeC) {
System.out.println("准备开始听音乐");
typeC.handleTypeC();
}
public static void main(String[] args) {
// // 人想听歌,需要一个适配器
// Person person = new Person();
// Adapter adapter = new Adapter();
// // 实现听歌
// person.listenToMusic(adapter);
Person person = new Person();
Phone phone = new Phone();
Adapter1 adapter = new Adapter1(phone);
person.listenToMusic(adapter);
}
}
总结
推荐使用对象适配器。
因为类适配器是通过继承对象和接口来完成,java不支持具体类的多继承,所以一个适配器只能继承一个具体类或者抽象类。
而类适配器是通过直接关联对象的方式完成的,一个适配器可以关联多个具体对象。