一、什么是适配者模式
适配器模式是一种结构性设计模式,它将一个类的接口转换成客户端所期望的另一个接口。
适配器模式使得原本由于接口不兼容而不能一起工作的类能够协同工作。
在Java中适配器模式通常分为两种类型:类适配器和对象适配器。
- 类适配器:类适配器通过多重继承实现,适配器类同时继承目标类并实现适配者类接口。通过继承目标类,适配器类可以访目标类的方法和属性;通过实现适配者类接口,适配器类可以将适配者类的方法转换为目标类的方法。
- 对象适配器:对象适配器通过组合实现,适配器类持有适配者类的实例,并同时实现目类的接口。通过持有适配者类的实例,适配器类可以调用适配者类的方法;通过实现目标类的接口,适配器类可以将适配者类的方法转换为目标类的方法。
适配器模式的主要作用是解决两不兼容接口之间的问题,它可以使得原本无法协同工作的类能够一起工作,适配器模式常用于以下
3
个场景:
- 将旧版本的接口适配成新版本的接口,以保证代码的兼容性和可复用性。
- 在第三方库或框架时,通过适配器模式将其接口转换为自己系统中的标准接口。
- 将多个类的接口适配成一个统一的接口,简化客户端代码。
适配器模式在实际开发中非常常用,它可以帮我们解决不同接口之间的兼容性问题,提高代码的复用性和灵活性。
二、适配者模式实例
下面是一个简单的 Java 适配器模式的示例代码,请同学们复制到本地执行。
// 目标接口
interface Target {
void request();
}
// 适配者类
class Adaptee {
void specificRequest() {
System.out.println("适配者类的特殊请求");
}
}
//适配器
class Adapter extends Adaptee implements Target {
@Override
public void request() {
specificRequest();
}
}
// 对象适配器
class ObjectAdapter implements Target {
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
Override
public void request() {
adaptee.specificRequest();
}
}
// 客户端测试代码
public class AdapterPatternExample {
public static void main(String[] args) {
// 类适配器使用示例
Target target1 = new Adapter();
target1.request();
// 对象适配器使用示例 Adaptee adaptee = new Adaptee();
Target target2 = new ObjectAdapter(adaptee);
target2.request();
}
}
在上述示例中,我们定义了一个目标接口 Target
,包含一个 request
方法。适配者类 Adaptee
有一个特殊方法 specificRequest
,它的方法不符合目标接口的要求。通过类适配器和对象适配器两种方式实现了适配器模式。
在类适配器中,适配器类 Adapter
继承了适配者类 Adaptee
并实现了目标接 Target
,在 request
方法中通过调用 specificRequest
方法来实现请求。
在对象适配器中,适配器类 ObjectAdapter
持有一个适配者类 Adaptee
的实例,并在 request
方法中调用适配者类的方法来实现请求。
最后客户端代码中,我们实例化适配器对象,并通过调用 request
方法来触发适配器模式的执行。
三、适配者模式应用场景
适配器模式在实际开发中有多种应用场景,以下是
5
个常见的应用场景,请同学们认真学习。
- 使用第三方库或框架:当我们需要使用一个第三方库或框架的接口,但接口与我们的代码不兼容时,可以使用适配器模式来将第三方接口适配成我们自己系统中的标准接口。
- 系统升级或重构:当我们需要对旧系统进行升级或重构时,可能会存在一些旧版本的接口需要适配成新版本的接口,以保持代码的兼容性和可复用性。
- 多个类的接口统一:当我们有多个类的接口不一致,但又需要对它们进行统一处理时,可以使用适配器模式将它们的接口适配成统一的接口,以简化客户端代码。
- 包装功能:适配器模式还可以用于包装功能。例如,我们可以通过适配器在原有功能的基础上添加额外的功能,而不需要修改原有代码。
- 跨平台开发:在跨平台开发中,不同平台可能有不同的接口要求。适配器模式可以帮助我们将不同平台的接口转换成统一的接口,以便在不同平台上运行。
适配器模式可以解决不同接口之间的兼容性问题,提高代码的复用性和灵活性。适配器模式在实际开发中非常常用,特别是在面对不兼容接口的情况下,能够提供一种有效的解决方案。
四、适配者模式面试题
一、请简述适配器模式的原理。
适配器模式是一种结构性设计模式,它将一个类的接口转换成客户端所期望的另一个接口,从而使得原本由于接口不兼容而不能一起工作的类能够协同工作。适配器模式通过封装了一个已有类的接口来适配到另一个目标接口,并且使得这两个不兼容的接口能够协同工作。
二、请简述适配器模式的作用。
- 转换接口:适配器模式可以将一个类的接口转换成客户端所期望的另一个接口,从而使得原本不兼容的类能够一起工作。
- 复用功能:适配器模式可以复用现有的类,而无需修改其源代码,只需要提供一个适配器类来进行接口转换。
- 解耦系统:适配器模式可以将客户端代码与具体的类解耦,使得客户端代码只依赖于抽象的目标接口,而不依赖于具体的实现类。
三、适配器模式的实现方式有哪些?
适配器模式有两种主要的实现方式:类适配器和对象适配器。
- 类适配器: 类适配器通过多重继承实现,适配器类同时继承目标类并实现适配者类接口。通过继承目标类,适配器类可以访问目标类的方法和属性;通过实现适配者类接口,适配器类可以将适配者类的方法转换为目标类的方法。类适配器只能适配一个适配者类。
- 对象适配器: 对象适配器通过组合实现,适配器类持有适配者类的实例,并同时实现目标类的接口。通过持有适配者类的实例,适配器类可以调用适配者类的方法;通过实现目标类的接口,适配器类可以将适配者类的方法转换为目标类的方法。对象适配器可以适配多个适配者类。
四、适配器模式的实现方式有什么区别?
- 类适配器需要同时继承目标类和实现适配者类接口,因此只能适配一个适配者类,而对象适配器可以适配多个适配者类。
- 类适配器通过继承实现,因此适配器类可以访问到目标类的方法和属性。而对象适配器通过组合实现,适配器类只能通过适配者类的实例来访问其方法和属性。
- 类适配器适配者类的方法是通过继承来实现的,而对象适配器适配者类的方法是通过调用适配者类实例的方法来实现的。
由于单继承限制,类适配器模式无法同时适配多个适配者类。而对象适配器模式通过组合的方式可以实现适配多个适配者类。