1. 说明
- 1.Adapter(适配器)。
- 2.将一个类的接口转换成客户希望的另外一个接口。
- 3.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 4.类适配器使用多重继承对一个接口与另一个接口进行匹配。
- 5.对象适配器依赖于对象组合。
- 6.适配器模式是一种非常实用的设计模式,它能够帮助我们解决接口不兼容的问题,提高系统的灵活性和可扩展性。
2. 应用场景
- 1.旧接口适配新接口:当系统中的一个类需要使用另一个类的接口,但这两个类的接口不兼容时,可以使用适配器模式。
- 2.多个类的接口统一:当系统中的多个类的接口不统一时,可以使用适配器模式将它们的接口统一成一个接口,从而提高系统的灵活性和可扩展性。
- 3.封装有缺陷的接口设计:如果某个类的接口设计存在缺陷或不符合标准规范,可以使用适配器模式进行封装,使其更符合客户端的使用习惯或需求。
3. 结构图
- 1.类适配器结构图
- 2.对象适配器结构图
4. 构成
- 1.目标接口(Target Interface):定义客户端所期望使用的与特定领域相关的接口方法。
- 2.适配器(Adapter):适配器类实现目标接口,并持有一个适配者对象。适配器通过调用适配者对象的方法,将其转换为目标接口方法。适配器可以是类适配器(通过继承实现)或对象适配器(通过组合实现)。
- 3.适配者(Adaptee):已经存在的类或接口,提供了特定的功能,但与目标接口不兼容,这个接口需要适配。
- 4.客户端(Client):使用目标接口进行操作的类或对象。
5. 优缺点
5.1 优点
- 1.提高兼容性:能够解决接口不兼容的问题,使得原本不兼容的类能够协同工作。
- 2.灵活性:通过使用适配器,客户端代码可以独立于不兼容的接口进行编写,从而提高了系统的灵活性。当需要更换或修改被适配的类时,只需要修改适配器即可,而不需要修改客户端代码。
- 3.扩展性:适配器模式可以轻松地添加新的适配器来支持新的接口,这使得系统更易于扩展。
- 4.复用性:适配器可以复用现有的功能,通过转换接口来适应新的环境或需求,提高了代码的复用性。
5.2 缺点
- 1.增加复杂性:引入适配器模式可能会增加系统的复杂性,因为需要编写额外的适配器代码。这可能会使得系统的理解和维护变得更加困难。
- 2.性能损耗:适配器模式在转换接口的过程中可能会引入一些性能损耗,尤其是在处理大量数据时。这是因为适配器需要在客户端和被适配类之间进行额外的转换操作。
- 3.可能产生过多的适配器:如果系统中存在大量的不兼容接口,那么可能需要编写大量的适配器来解决这些问题。这可能会导致系统中存在过多的适配器类,使得系统结构变得复杂。
6. 适用性
- 1.想使用一个已经存在的类,而它的接口不符合要求。
- 2.想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
- 3.(仅适用于对象 Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
7. java示例
7.1 类适配器模式
package com.learning.adapter.class_adapter;
/**
* 旧打印机类,有老旧的打印方法
*/
public class OldPrinter {
public void printOld(String content){
System.out.println("旧打印机打印内容:" + content);
}
}
package com.learning.adapter.class_adapter;
/**
* 打印接口
*/
public interface Printable {
void print(String content);
}
package com.learning.adapter.class_adapter;
/**
* 新系统
*/
public class NewSystem {
private Printable printer;
public NewSystem(Printable printer){
this.printer = printer;
}
public void printDocument(String content){
printer.print(content);
}
}
package com.learning.adapter.class_adapter;
/**
* 旧打印机适配器类
*/
public class OldPrinterAdapter extends OldPrinter implements Printable{
@Override
public void print(String content){
// 调用旧打印机的打印方法
printOld(content);
}
}
package com.learning.adapter.class_adapter;
/**
* 客户端类
*/
public class Client {
public static void main(String[] args) {
NewSystem newSystem = new NewSystem(new OldPrinterAdapter());
newSystem.printDocument("Hello World!");
}
}
- 6.示例截图
7.2 对象适配器模式
package com.learning.adapter.object_adapter;
/**
* 旧打印机适配器类
*/
public class OldPrinterAdapter implements Printable {
private OldPrinter oldPrinter;
public OldPrinterAdapter(OldPrinter oldPrinter){
this.oldPrinter = oldPrinter;
}
@Override
public void print(String content){
// 调用旧打印机的打印方法
oldPrinter.printOld(content);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
package com.learning.adapter.object_adapter;
/**
* 客户端类
*/
public class Client {
public static void main(String[] args) {
NewSystem newSystem = new NewSystem(new OldPrinterAdapter(new OldPrinter()));
newSystem.printDocument("Hello World!");
}
}