Patrón de diseño | Patrón de adaptador

1 | Descripción general del modo de adaptador

Pensemos en un fenómeno de la vida común. El voltaje eléctrico de vida de nuestro país es de 220 V, pero el voltaje de funcionamiento real de los teléfonos móviles, computadoras portátiles, televisores y otros equipos no es tan alto. Para que estos equipos utilicen electricidad de 220 V de vida útil, es necesario El adaptador de corriente (AC Adpater) es también un cargador o un transformador. Con este adaptador de corriente, los electrodomésticos y otros equipos que no pueden funcionar directamente pueden ser compatibles y utilizados, y el adaptador de corriente entre ellos actúa como un adaptador.

De manera similar, en el desarrollo de software, a veces ocurre este tipo de incompatibilidad similar.También podemos introducir un rol llamado adaptador como un adaptador de corriente para coordinar estas estructuras incompatibles.Este esquema de diseño es el modo adaptador. 

Similar al adaptador de corriente, una clase de empaquetado llamada Adaptador se introduce en el modo de adaptador, y el objeto que envuelve se llama Adaptee, que es la clase que se va a adaptar. La realización del adaptador es convertir la solicitud de la clase cliente en una llamada a la interfaz correspondiente del adaptador. Es decir: cuando la clase de cliente llama al método del adaptador, se llamará al método de la clase de adaptador dentro de la clase de adaptador, y este proceso es transparente para la clase de cliente, y la clase de cliente no accede directamente al adaptador. clase. Por lo tanto, el adaptador permite que las clases que no pueden interactuar debido a interfaces incompatibles trabajen juntas.

1.1 Definición del modo de adaptador

  • Patrón de adaptador : convierta la interfaz de una clase en otra interfaz que el cliente desee. El modo adaptador permite que las clases con interfaces incompatibles trabajen juntas.
  • Patrón de adaptador : convierta la interfaz de una clase en otra interfaz que esperan los clientes. El adaptador permite que las carcasas funcionen juntas que de otra manera no podrían hacerlo debido a las conexiones compatibles.

El patrón de adaptador puede hacer coincidir la interfaz de una clase con la interfaz de otra clase sin modificar la interfaz del adaptador original y la clase de interfaz de destino abstracta.

El alias del patrón de adaptador es el patrón de envoltura , que se puede utilizar como patrón de estructura de clases o patrón de estructura de objeto . La interfaz mencionada en la definición del patrón del adaptador se refiere a una interfaz amplia, que puede representar un método o una colección de métodos.

2 | La estructura e implementación del patrón adaptador

El patrón de adaptador incluye adaptador de clase y adaptador de objeto. En el patrón de adaptador de objeto, existe una relación de asociación entre el adaptador y el adaptador; en el patrón de adaptador de clase, el adaptador y el adaptador tienen una relación de herencia (o realización). El siguiente es un análisis estructural de los dos adaptadores.

2.1 La estructura del modo adaptador

El modo de adaptador contiene los siguientes 3 roles

  • (1) Destino (clase abstracta de destino): La clase abstracta de destino define la interfaz requerida por el cliente, que puede ser una clase o interfaz abstracta o una clase concreta. En el adaptador de clases, debido a que el lenguaje C # presenta una herencia única y múltiples extensiones de interfaz.
  • (2) Adaptador (clase Adaptador): Puede llamar a otra interfaz como convertidor para adaptar Adaptee y Target. El adaptador es el núcleo del patrón del adaptador. En el adaptador de clase, conecta los dos implementando la interfaz de Target y heredando la clase Adaptee. En el adaptador de objetos, conecta los dos heredando Target y asociando un objeto Adaptee.
  • (3) Adaptee (clase de adaptador): El adaptador es el rol que se va a adaptar. Define una interfaz existente que necesita ser adaptada. La clase de adaptador es generalmente una clase específica, y la oración contiene el cliente El método de negocio que desea Es posible que el uso ni siquiera tenga el código fuente de la clase de adaptador en algunos casos.

2.2 Implementación del modo adaptador

Dado que el modo de adaptador incluye dos formas de modo de adaptador de clase y modo de adaptador de objeto, a continuación se describen los mecanismos de implementación de estos dos modos de adaptador.

2.2.1 Adaptador de clase

En el adaptador de clase, el adaptador de clase Adaptee no tiene un método Beavast () y el cliente espera este método, pero el método SpecificRequest () se implementa en la clase de adaptador. La implementación proporcionada por este método es exactamente lo que el cliente necesita . Para permitir que los clientes utilicen la clase de adaptador, se proporciona una clase intermedia, a saber, la clase Adaptet. La clase de adaptador implementa la interfaz de clase de objeto de objeto Target y hereda la clase de adaptador. En el Reqpest () de la clase de adaptador El método llama el método SpecificRequest () de la clase de adaptador heredada para lograr el propósito de la adaptación Dado que la clase de adaptador y la clase de adaptador se heredan , este modo de adaptador se denomina modo de adaptador de clase. El código de adaptador de clase típico es el siguiente:

interface ITarget
{
    string Request();
}

class Adaptee
{
    public string SpecificRequest() => "Adaptee.SpecificRequest";
}

class ClassAdapter : Adaptee, ITarget
{
    public string Request() => $"ClassAdapter.Request 调用 {base.SpecificRequest()}";
}

2.2.2 Adaptador de objetos

En el adaptador de objetos, el cliente necesita llamar al método Request (), mientras que la clase Adaptee no tiene este método, pero el método SpecificRequest () que proporciona es lo que el cliente necesita. Para permitir que el cliente utilice la clase de adaptador, es necesario proporcionar un adaptador de clase de contenedor, la clase de adaptador. Esta clase contenedora envuelve una instancia de un adaptador para conectar el cliente con el adaptador y llama al método SpecificRequest () de Adaptor en el método Request () del adaptador. Dado que la clase de adaptador y la clase de adaptador están en una relación de asociación (también denominada relación de delegación ), este patrón de adaptador se denomina patrón de adaptador de objeto. El código de adaptador de objeto típico es el siguiente:

class ObjectAdapter : ITarget
{
    private readonly Adaptee _Adaptee; //维持一个适配者对象的引用

    public ObjectAdapter(Adaptee adaptee)
    {
        _Adaptee = adaptee;
    }

    public string Request() => $"ObjectAdapter.Request 调用 {_Adaptee.SpecificRequest()}";
}

El patrón del adaptador puede hacer coincidir la interfaz de una clase con la interfaz de otra clase. La premisa de usarlo es que no puede o no desea modificar la interfaz del adaptador original y la interfaz de la clase de destino abstracta. Por ejemplo: Se compran algunas bibliotecas o controles de clases de terceros, pero no hay código fuente. En este momento, el modo adaptador se puede utilizar para unificar la interfaz de acceso a objetos.
El patrón de adaptador enfatiza más en la organización del código que en la realización de la función. En el desarrollo real, la frecuencia de uso de adaptadores de objetos es mayor.

Llamada del cliente

3 | Ejemplos de aplicación del patrón adaptador

Diseño de código

  1. ScoreOperation: una clase de operación de puntuación abstracta que sirve como interfaz de destino.
  2. QuickSortClass: clase de clasificación rápida, que actúa como un adaptador.
  3. BinarySearchClass: clase de búsqueda binaria, que actúa como una clase de adaptación.
  4. El archivo de configuración App.config almacena el nombre de la clase (nombre completo) de la clase del adaptador en el archivo de configuración.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="adapter" value="AdapterPattern.Sample.OperationAdapter"/>
  </appSettings>
</configuration>

Para obtener los detalles del código anterior, consulte =》https://gitee.com/dolayout/DesignPatternOfCSharp/tree/master/DesignPatternOfCSharp/AdapterPattern

Llamada del cliente

4 | Modo de adaptador predeterminado

El modo de adaptador predeterminado es una variante del modo de adaptador, y su aplicación también está más extendida.Este modo también se denomina modo de adaptador de interfaz única .

4.1 Definición del modo de adaptador predeterminado

  • Patrón de adaptador predeterminado : cuando no necesita implementar todos los métodos proporcionados por una interfaz, primero puede diseñar una clase abstracta para implementar la interfaz y proporcionar una implementación predeterminada (método vacío) para cada método en la interfaz, luego la subclase de esta clase abstracta puede anular selectivamente algunos métodos de la clase principal para lograr los requisitos. Es adecuado para situaciones en las que no desea utilizar todos los métodos en una interfaz, que también se conoce como el modo de adaptador de interfaz única.

4.2 El modo de adaptador predeterminado contiene las siguientes 3 funciones:

  • (1) IServiceInterface (interfaz del adaptador) : Es una interfaz y, por lo general, se declara una gran cantidad de métodos en la interfaz.
  • (2) AbstractServiceClass (clase de adaptador predeterminada) : es la clase principal del patrón de adaptador predeterminado, que implementa los métodos declarados en la interfaz ServiceInterface en forma de métodos vacíos. Por lo general, se define como una clase abstracta, porque no tiene ningún sentido crear una instancia.
  • (3) ConcreteServiceClass (clase de servicio específica) : es una subclase de la clase de adaptador predeterminada. Antes de que se introduzca el adaptador, debe implementar la interfaz del adaptador, por lo que debe implementar todos los métodos declarados en la interfaz del adaptador. Algunos métodos que no es necesario utilizar deben proporcionar implementaciones vacías. Después de tener el adaptador predeterminado, puede heredar directamente la clase de adaptador y anular selectivamente los métodos definidos en la clase de adaptador según sea necesario.

Entre ellos, el fragmento de código típico de la clase de adaptador predeterminado es el siguiente:

interface IServiceInterface 
{
    void ServiceMethod1();
    void ServiceMethod2();
    void ServiceMethod3();
}

abstract class AbstractServiceClass : IServiceInterface
{
    public void ServiceMethod1() { } // 空方法
    public void ServiceMethod2() { }
    public void ServiceMethod3() { }
}

5 | Modo adaptador bidireccional

Durante el uso del adaptador de objetos, si el adaptador contiene referencias tanto a la clase de destino como a la clase de adaptador, el adaptador puede usarlo para llamar a métodos en la clase de destino, y la clase de destino también puede llamar a la clase de adaptador a través de él. , entonces el adaptador es un adaptador bidireccional.

La implementación del adaptador bidireccional es más complicada y su código típico es el siguiente:

class TwoWayApapter : Adaptee, ITarget
{
    // 同时维持抽象目标类和适配者的引用
    private readonly Adaptee _Adaptee;
    private readonly ITarget _Target;

    public TwoWayApapter(Adaptee adaptee) 
    {
        _Adaptee = adaptee;
    }

    public TwoWayApapter(ITarget target)
    {
        _Target = target;
    }

    public new string SpecificRequest() => _Target.Request();

    public string Request() => _Adaptee.SpecificRequest();

}

6 | Ventajas y desventajas del modo de adaptador y el entorno aplicable

El patrón de adaptador transforma la interfaz existente en la interfaz esperada por la clase del cliente y se da cuenta de la reutilización de la clase existente. Es un patrón de diseño con una frecuencia de uso muy alta y ha sido ampliamente utilizado en el desarrollo de software.

6.1 Ventajas del modo adaptador (tanto el modo adaptador de objeto como el modo adaptador de clase)

  • (1) Desacople la clase de destino y la clase de adaptador y reutilice la clase de adaptador existente introduciendo una clase de adaptador sin modificar la estructura original.
  • (2) Aumentar la transparencia y la reutilización de la clase, encapsular el proceso de realización empresarial específico en la clase del adaptador, que es transparente para la clase del cliente, y mejora la reutilización del adaptador. Una es que la clase del adaptador se puede reutilizar en múltiples diferentes sistemas.
  • (3) La flexibilidad y la escalabilidad son muy buenas. Mediante el uso de archivos de configuración, el adaptador se puede reemplazar fácilmente y se pueden agregar nuevas clases de adaptadores sin modificar el código original, que está totalmente en línea con los principios de apertura y cierre.

Específicamente, el patrón de adaptador de clase también tiene las siguientes ventajas:

  • Dado que la clase de adaptador es una subclase de la clase de adaptador, algunos métodos de adaptador se pueden reemplazar en la clase de adaptador para hacer que el adaptador sea más flexible.

El modo de adaptador de objetos también tiene las siguientes ventajas:

  • (1) Un adaptador de objeto puede adaptar varios adaptadores diferentes al mismo objetivo.
  • (2) El modo adaptador de objetos puede adaptarse a una subclase de un adaptador Dado que el adaptador y el adaptador están asociados, según el principio de sustitución de Richter, la subclase del adaptador también se puede adaptar a través del adaptador.

6.2 Desventajas
del modo adaptador Las principales desventajas del modo adaptador de clase son las siguientes:

  • (1) Para los lenguajes que no admiten la herencia de clases múltiples, como C # y Java, como máximo se puede adaptar una clase de adaptador a la vez, y se pueden adaptar varios adaptadores al mismo tiempo.
  • (2) La clase de adaptador no puede ser la clase final, por ejemplo, no puede ser la clase sellada en C #.
  • (3) En lenguajes como C # y Java, la clase abstracta de destino en el patrón de adaptador de clase solo puede ser una interfaz, no una clase, y su uso tiene ciertas limitaciones.

Las principales desventajas del patrón de adaptador de objetos son las siguientes:

  • En comparación con el patrón de adaptador de clase, algunos métodos para reemplazar la clase de adaptador en el adaptador son más problemáticos. Si debe reemplazar uno o más métodos de la clase de adaptador, primero puede crear una subclase de la clase de adaptador, eliminar el método de la clase de adaptador y luego tratar la subclase de la clase de adaptador como el proceso de adaptación real. es más complicado.

6.3 Entorno aplicable del modo adaptador

  • (1) El sistema necesita usar algunas clases existentes y las interfaces de estas clases (como los nombres de los métodos) no satisfacen las necesidades del sistema, e incluso no hay código fuente para estas clases.
  • (2) Cree una clase reutilizable para trabajar con clases que no están muy relacionadas entre sí, incluidas las clases que pueden introducirse en el futuro.

 

Supongo que te gusta

Origin blog.csdn.net/ChaITSimpleLove/article/details/115056329
Recomendado
Clasificación