设计模式 - 浅谈适配器模式
适配器模式
模式功能说明:它使得原本由于接口不兼容而不能一起工作的类可以协同工作。
模式思路与原理
- 类的适配器模式:通过继承来实现适配器功能。当我们要将一个类A转化为接口B的实现类时,可以创建一个新的类,继承类A,实现接口B,然后在新的类中重写接口B的方法,调用类A的方法来实现。
- 对象的适配器模式:通过组合来实现适配器功能。当我们要将一个对象A转化为接口B的实现对象时,可以创建一个新的类,实现接口B,然后在新的类中创建一个类A的对象,再重写接口B的方法,调用类A的对象的方法来实现。
- 接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类,实现所有方法,我们写别的类的时候,继承抽象类即可。
案例
类的适配器模式
// 目标接口
interface Target {
void request();
}
// 适配者类
class Adaptee {
public void specificRequest() {
System.out.println("适配者中的业务代码被调用!");
}
}
// 适配器类
class ClassAdapter extends Adaptee implements Target {
public void request() {
specificRequest();
}
}
// 测试类
public class Client {
public static void main(String[] args) {
System.out.println("类的适配器模式测试:");
Target target = new ClassAdapter();
target.request();
}
}
代码如果理解不了的话,可以理解一下下面这个场景:我们有一个220V的电源,我们的笔记本电脑需要20V的电源,这时我们就需要一个电源适配器来将220V的电源转化为20V的电源。在这个例子中,220V的电源就是适配者类,20V的电源就是目标接口,电源适配器就是适配器类。
对象适配器模式
// 适配器类
class ObjectAdapter implements Target {
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
adaptee.specificRequest();
}
}
// 测试类
public class Client {
public static void main(String[] args) {
System.out.println("对象的适配器模式测试:");
Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee);
target.request();
}
}
代码如果理解不了的话,可以理解一下下面这个场景:我们有多个电源,例如220V的电源和110V的电源,我们的笔记本电脑需要20V的电源,这时我们就需要一个电源适配器来将这些电源转化为20V的电源。在这个例子中,220V的电源和110V的电源就是适配者对象,20V的电源就是目标接口,电源适配器就是适配器类。
接口适配器模式
// 适配器类
abstract class InterfaceAdapter implements Target {
public void request() {}
}
// 适配者类
class ConcreteAdapter extends InterfaceAdapter {
public void request() {
System.out.println("适配者的代码被调用!");
}
}
// 测试类
public class Client {
public static void main(String[] args) {
System.out.println("接口的适配器模式测试:");
Target target = new ConcreteAdapter();
target.request();
}
}
代码如果理解不了的话,可以理解一下下面这个场景:我们有一个接口,这个接口有很多方法,但是我们只需要实现其中的几个方法,这时我们就可以创建一个抽象类,实现这个接口,然后在抽象类中提供所有方法的默认实现,我们的类只需要继承这个抽象类,然后重写我们需要的方法即可。在这个例子中,接口就是目标接口,抽象类就是适配器类,我们的类就是适配者类。
依赖原则
适配器模式的实现原则是:开闭原则,即对扩展开放,对修改关闭。在适配器模式中,我们可以通过添加一个新的适配器类来提供新的接口,而无需修改原有代码。