1. Introducción
Es decir, defina una clase de empaquetado para empaquetar objetos incompatibles
Clase de envoltura = adaptador
Clase envuelta = adaptado
1.1 Escena
- El sistema necesita reutilizar las clases existentes y la interfaz de esta clase no cumple con los requisitos del sistema.
- Varios componentes tienen funciones similares, pero las interfaces no son uniformes y pueden cambiar con frecuencia
1.2 Ventajas
- Mejor reutilización El
sistema necesita usar clases existentes y tales interfaces no satisfacen las necesidades del sistema. - Transparente y simple El
cliente puede llamar a la misma interfaz, por lo que es transparente para el cliente - Mejor escalabilidad
Al implementar la función del adaptador, puede llamar a la función desarrollada por usted mismo, expandiendo así naturalmente la función del sistema - Desacoplamiento Desacople
la clase de destino y la clase de adaptador, y reutilice la clase de adaptador existente introduciendo una clase de adaptador sin modificar el código original - Cumplir con el principio de abrir-cerrar. El
mismo adaptador puede adaptar tanto la clase de adaptador como sus subclases a la interfaz de destino; se pueden implementar diferentes adaptadores para diferentes interfaces de destino sin modificar la clase a adaptar
1.3 Desventajas
- El uso excesivo de adaptadores hará que el sistema sea muy complicado y difícil de comprender en su conjunto.
1.4 Clasificación
- Adaptador de clase
- Adaptador de objeto
2. Adaptador de clase
Utilice la relación de herencia para convertir el método de la clase envuelta en el método de destino
2.1 Escena
- Necesidad de redefinir parte del comportamiento de Adaptee
- Cuando quieras usarlo cómodamente
2.2 Ventajas
- Código simplificado y fácil de usar.
Solo se introduce un objeto y no se necesitan campos adicionales para hacer referencia a la instancia de Adaptee.
Desventajas
2.3 Desventajas
- Alto acoplamiento, baja flexibilidad, el
uso de la herencia de objetos es una definición estática
2.4 Uso
1. 创建目标接口
public interface Target {
void requestFnc();
}
2. 创建被包装的类
public class Adaptee {
public void sourceFnc() {
System.out.println("adaptee fnc.");
}
}
3. 创建适配类
/**
* 类的适配器模式:使用继承关系连接到Adaptee类
*
* @author dkangel
*/
public class ClassAdapter extends Adaptee implements Target {
/**
* 适配目标方法
*/
@Override
public void requestFnc() {
super.sourceFnc();
System.out.println("convert sourceFnc to requestFnc.");
}
}
4. 使用
public class Main {
public static void main(String[] args) {
Target target = new ClassAdapter();
target.requestFnc();
}
}
3. Adaptador de objetos
Al igual que el adaptador de la clase, el método de la clase envuelta se convierte en el método de destino
Diferente: el adaptador de la clase usa la relación de herencia para conectarse al adaptador y el adaptador del objeto usa la relación de delegación para conectarse al adaptador
2.1 Escena
- Uso flexible
- Necesita configurar la clase fuente y sus subclases al mismo tiempo
2.2 Ventajas
- Alta flexibilidad y bajo acoplamiento El
método adoptado对象组合
es un método de combinación dinámica
2.3 Desventajas
- El uso complejo
requiere la introducción de instancias de objetos
2.4 Uso
1. 创建目标接口
public interface Target {
void requestFnc();
}
2. 创建被包装的类
public class Adaptee {
public void sourceFnc() {
System.out.println("adaptee fnc.");
}
}
3. 创建适配类
/**
* 对象的适配器模式:使用委派关系连接到Adaptee类
*
* @author dkangel
*/
public class ObjAdapter implements Target {
private Adaptee adaptee;
public ObjAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void requestFnc() {
this.adaptee.sourceFnc();
System.out.println("convert sourceFnc to requestFnc.");
}
}