Compartir tecnología

Ejemplos de implementación de escenarios de uso de patrones de diseño y ventajas y desventajas (patrón estructural - patrón proxy, patrón de apariencia)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

patrón estructural

Patrón de proxy

Proxy Pattern es un patrón de diseño estructural que controla el acceso a otro objeto mediante la introducción de un objeto proxy. Este objeto proxy puede proporcionar funcionalidad adicional al objeto proxy, como control de acceso, inicialización diferida, registro o acceso a la red.

Escena aplicable

  1. agente remoto

    • Proporciona representación local de un objeto en diferentes espacios de direcciones.
  2. agente virtual

    • Crea objetos costosos según sea necesario.
  3. agente de protección

    • Controlar el acceso al objeto original.
  4. Orientación inteligente

    • Realice algunas operaciones adicionales al acceder al objeto, como operaciones de conteo o detección de referencia.

Ejemplo de implementación (Java)

El siguiente es un ejemplo de implementación simple del patrón de proxy, que muestra cómo controlar el acceso a un objeto real a través de un objeto proxy.

1. Definir la interfaz del tema.
public interface Subject {
    void request();
}
  • 1
  • 2
  • 3
  • ilustrarSubject La interfaz define unrequest Método, este es el método que tanto el objeto real como el objeto proxy deben implementar.
2. Definir la clase de sujeto real (RealSubject)
public class RealSubject implements Subject {
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • ilustrarRealSubject clase implementadaSubject Interfazrequest Método, que representa la clase que realmente maneja la solicitud.
3. Definir clase de proxy (Proxy)
public class Proxy implements Subject {
    private RealSubject realSubject;

    public Proxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    public void request() {
        if (this.checkAccess()) {
            this.realSubject.request();
            this.logAccess();
        }
    }

    private boolean checkAccess() {
        // 检查访问权限
        System.out.println("Proxy: Checking access prior to firing a real request.");
        return true;
    }

    private void logAccess() {
        // 记录请求日志
        System.out.println("Proxy: Logging the time of request.");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • ilustrar
    • Proxy clase implementadaSubject interfaz y tiene unRealSubject objeto.
    • existir request En el método, la clase proxy primero verifica los permisos de acceso y luego llama al objeto real.request método y finalmente registre el registro de solicitudes.
4. Código de cliente
public class Client {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Proxy proxy = new Proxy(realSubject);
        
        proxy.request();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • ilustrar
    • Client clase creadaRealSubject yProxy objeto, a través deProxy llamada de objetorequest método para controlar laRealSubject Acceso.

ventaja

  1. Aislamiento

    • El modo proxy puede servir como intermediario entre la persona que llama y el objeto real, reduciendo el acoplamiento entre los componentes del sistema y mejorando el aislamiento entre los objetos.
  2. seguridad

    • El acceso a objetos reales se puede controlar a través de servidores proxy, lo que permite realizar controles de seguridad y una verificación en profundidad.
  3. Escalabilidad

    • El modo proxy puede agregar funciones de manera flexible sin modificar el código objeto específico.
  4. Inteligente

    • Algunas operaciones adicionales, como la inicialización retrasada y los registros de acceso, se pueden implementar sin cambiar la interfaz del objeto de servicio.

defecto

  1. complejidad del código

    • Introducir agentes también significa aumentar la complejidad del sistema, posiblemente introducir nuevas clases e interfaces y aumentar la comprensión del código y los costos de mantenimiento.
  2. Tiempo de respuesta

    • El modo proxy puede hacer que el sistema funcione más lento, especialmente si se agrega mucha lógica de procesamiento a la operación del proxy.
  3. Dificultad de diseño

    • Diseñar e implementar correctamente el patrón de proxy requiere una consideración cuidadosa del diseño general del sistema para garantizar que no haya un impacto negativo en el rendimiento del sistema.

Diagrama de clase

Client
  |
  v
Subject <---- Proxy <---- RealSubject
  • 1
  • 2
  • 3
  • 4

Resumir

El patrón de proxy proporciona una forma eficaz de controlar y gestionar el acceso a los objetos. Al utilizar servidores proxy, puede agregar varias funciones manteniendo claras las responsabilidades de los objetos comerciales. Este modo es particularmente adecuado para escenarios que requieren control de acceso y otras operaciones de preprocesamiento en objetos comerciales.

Patrón de fachada

Facade Pattern es un patrón de diseño estructural que facilita el uso de subsistemas complejos al proporcionar una interfaz unificada para acceder a un grupo de interfaces en el subsistema. El patrón de fachada define una interfaz de alto nivel que hace que este subsistema sea más fácil de usar.

Escena aplicable

  1. Simplifique las interfaces para sistemas complejos

    • Proporcione una interfaz simple para subsistemas complejos para reducir la complejidad de las interacciones externas con los subsistemas.
  2. Jerarquía

    • En una estructura de sistema multicapa, se pueden usar patrones de apariencia para definir la entrada a cada capa y simplificar las dependencias entre capas.
  3. Sistema desacoplado

    • Al introducir el patrón de apariencia, se reduce el acoplamiento entre el subsistema y el cliente.

Ejemplo de implementación (Java)

El siguiente es un ejemplo de implementación simple del patrón Facade, que muestra cómo simplificar el uso de subsistemas a través de clases de fachada.

1. Definir clases de subsistema
public class SubsystemA {
    public void operationA() {
        System.out.println("SubsystemA: operationA");
    }
}

public class SubsystemB {
    public void operationB() {
        System.out.println("SubsystemB: operationB");
    }
}

public class SubsystemC {
    public void operationC() {
        System.out.println("SubsystemC: operationC");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
2. Definir la clase de apariencia.
public class Facade {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;
    private SubsystemC subsystemC;

    public Facade() {
        this.subsystemA = new SubsystemA();
        this.subsystemB = new SubsystemB();
        this.subsystemC = new SubsystemC();
    }

    public void operation1() {
        System.out.println("Facade: operation1");
        subsystemA.operationA();
        subsystemB.operationB();
    }

    public void operation2() {
        System.out.println("Facade: operation2");
        subsystemB.operationB();
        subsystemC.operationC();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
3. Código de cliente
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.operation1();
        facade.operation2();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Notas

  1. Clase de subsistema

    • SubsystemA, SubsystemB, y SubsystemC Es la clase de implementación específica del subsistema y cada clase tiene su propio método de operación único.
  2. clase de apariencia

    • Facade Las clases contienen objetos del subsistema y proporcionan interfaces simplificadas.operation1 yoperation2 para llamar a funciones del subsistema.
  3. codigo del cliente

    • Client clase aprobadaFacade clase para llamaroperation1 yoperation2, simplificando así el uso de subsistemas complejos.

ventaja

  1. Interfaz simplificada

    • El patrón de apariencia proporciona una interfaz simple para los subsistemas, lo que reduce la complejidad de interactuar con los subsistemas.
  2. bajo acoplamiento

    • El patrón de apariencia reduce el acoplamiento entre el subsistema y el cliente, lo que ayuda a mejorar la mantenibilidad y escalabilidad del sistema.
  3. mejores capas

    • Los patrones de apariencia ayudan a establecer una estructura jerárquica clara, definiendo la entrada a cada nivel.

defecto

  1. No cumple con el principio de abrir-cerrar.

    • Al agregar nuevas funciones del subsistema, puede ser necesario modificar la clase de apariencia, lo que viola el principio abierto-cerrado (abierto para extensiones, cerrado para modificaciones).
  2. Puede causar problemas de rendimiento

    • En algunos casos, el uso del patrón de fachada puede provocar una degradación del rendimiento del sistema porque todas las solicitudes deben pasar por la clase de fachada.

Diagrama de clase

Client
  |
  v
Facade ----> SubsystemA
          ----> SubsystemB
          ----> SubsystemC
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Resumir

El patrón Facade facilita el trabajo con subsistemas complejos al proporcionar una interfaz simplificada. Es adecuado para escenarios donde es necesario simplificar la interfaz del subsistema, reducir la interacción directa entre el cliente y el subsistema y desacoplar la jerarquía del sistema. Aunque tiene el potencial de violar el principio abierto-cerrado, en la mayoría de los casos sus ventajas superan con creces sus desventajas, lo que hace que el diseño del sistema sea más claro y más fácil de mantener.