前言
- 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
- 简单理解:设计模式就是各种套路
- 适配器设计模式:解决接口与接口实现类之间的矛盾问题
需求分析
在实际开发过程中,当一个接口中抽象方法过多,但是我们只要使用其中一部分的时候,就可以使用适配器设计模式来实现代码(如果不使用适配器模式,一个非抽象类实现了这个接口,必须重写接口中的所有抽象方法)。
书写步骤
- 编写中间类XXXAdapter,实现对应的接口
- 对接口中的抽象方法进行空实现
// 动物接口
public interface Animal {
void makeSound();
void move();
}
- 让真正的实现类继承中间类,并重写需要用的方法
- 为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰
案例实现
创建一个名为
Animal
的接口,一个具体的实现类Dog
,以及一个适配器AnimalAdapter
。我们的目标是让Dog
类适配到Animal
接口,但Dog
类本身并不直接实现Animal
接口。我们将使用一个抽象的中间类AnimalAdapter
来实现这一目的。
Aminal接口:
// 动物接口
public interface Animal {
void makeSound();
void move();
}
Dog类:
// 狗类
public class Dog {
public void bark() {
System.out.println("Woof! Woof!");
}
public void run() {
System.out.println("The dog is running.");
}
}
AnimalAdapter抽象适配器类:
- 设计为抽象类的目的是防止其他类创建适配器对象(因为适配器本身没有意义,只是用来适配,如果被创建出来对象是不正常的一种体现)。
- 抽象适配器类
AnimalAdapter
,它实现了Animal
接口,但方法都是空实现。
// 动物适配器抽象类
public abstract class AnimalAdapter implements Animal {
// 空实现
@Override
public void makeSound() {
// 这个方法需要在子类中实现
}
// 空实现
@Override
public void move() {
// 这个方法需要在子类中实现
}
}
DogAdapter适配器类:
适配器类
DogAdapter
,它继承自AnimalAdapter
并重写需要的方法
// 狗适配器类
public class DogAdapter extends AnimalAdapter {
private Dog dog;
public DogAdapter(Dog dog) {
this.dog = dog;
}
@Override
public void makeSound() {
// 调用Dog类的bark方法
dog.bark();
}
@Override
public void move() {
// 调用Dog类的run方法
dog.run();
}
}
测试
// 测试类
public class AdapterPatternDemo {
public static void main(String[] args) {
// 创建一个Dog实例
Dog dog = new Dog();
// 创建一个DogAdapter实例,将Dog适配到Animal接口
Animal animal = new DogAdapter(dog);
// 使用Animal接口的方法来调用Dog的方法
animal.makeSound(); // 输出: Woof! Woof!
animal.move(); // 输出: The dog is running.
}
}
这样我们就可以针对需要的接口方法进行实现,增加了代码的扩展性和维护性。