文章目录
前言
本文主要学习适配器模式,见名知意,适配器让两个本来接口不兼容不能一起工作的类,合作无间。
一、介绍
适配器模式主要是把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
常见的几类适配器如下:
- 类的适配器模式:将一个类转换成满足另一个新接口的类时,可以使用类的适配器器模式,创建一个新类,继承原有的类,实现新的接口即可。
- 对象的适配器模式:将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配器类的方法中,调用实例的方法就行。
- 接口的适配器模式:实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即可。
二、详细分析
1.核心组成
- 目标角色(Target):期待得到的接口;
- 源角色(Adaptee):需要适配的接口;
- 适配器角色(Adapter):把源接口转换为目标接口。
接口适配器模式
一个类不需要实现接口类所有的接口时使用。
类适配器模式
A类与B类互不关联,要做到互相调用时使用。
2.实现步骤
接口适配器模式
一个类不需要实现所有接口类的接口时使用。
- 新建接口类;
- 新建适配器类,实现接口类(空实现);
- 新建源类,继承适配器类,想实现几个接口就实现几个接口。
类适配器模式
A类与B类互不关联,要做到互相调用时使用。
- 新建源类,包含源类方法;
- 新建目标类(接口),目标类中有一个方法与源类方法一致;
- 新建适配器类,继承源类,实现目标类;
3.代码示例
接口适配器模式
场景:动物类通用接口,包含了多个方法如:叫,跑,飞,游泳等等。如果新建小狗类来实现动物类接口,其中的有些方法是小狗所不需要的,如飞,游泳。所以新建适配器类只实现小狗类所关注的接口。
目标类
/**
* 动物类接口
*/
public interface Animal {
/**
* 叫
*/
void call();
/**
* 跑
*/
void run();
/**
* 飞
*/
void fly();
/**
* 游泳
*/
void swim();
/**
* 跳
*/
void jump();
}
适配器类
/**
* 适配器类
*/
public class DogAdapter implements Animal{
@Override
public void call() {
}
@Override
public void run() {
}
@Override
public void fly() {
}
@Override
public void swim() {
}
@Override
public void jump() {
}
}
源类
public class Dog extends DogAdapter{
@Override
public void call() {
System.out.println("叫");
}
@Override
public void run() {
System.out.println("跑");
}
}
测试类
public static void main(String[] args) {
// 直接new 对象 调用方法
Dog dog = new Dog();
dog.call();
dog.run();
}
结果
类适配器模式
场景:一台电脑要播放U盘中的视频,需要使用转接头关联U盘。
目标类
/**
* 目标类
*/
public interface ComputerTarget {
/**
* 与电脑类的方法一致
*/
void player();
/**
* 视频
*/
void video();
}
源类
public class Computer {
public void player(){
System.out.println("打开播放器播放");
}
}
适配器
/**
* 适配器
*/
public class USBDriveAdapter extends Computer implements ComputerTarget {
/**
* 视频
*/
@Override
public void video(){
System.out.println("视频");
}
}
测试类
public static void main(String[] args) {
USBDriveAdapter usbDriveAdapter = new USBDriveAdapter();
usbDriveAdapter.player();
usbDriveAdapter.video();
}
结果
4.优缺点
优点
- 可以让任何两个没有关联的类一起运行,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;
- 增加灵活度, 提高复用性,适配器类可以在多个系统使用,符合开闭原则。
缺点
- 过多的使用适配器,会让系统非常零乱,不易整体进行把握。
5.使用场景
- 系统需要复用现有类,而该类的接口不符合系统的需求,可以使用适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;
- 多个组件功能类似,但接口不统一且可能会经常切换时,可使用适配器模式,使得客户端可以以统一的接口使用它们。
总结
以上简单介绍了适配器模式的优缺点和使用场景,还提供了代码示例。