15. Modo proxy de "modo de aislamiento de interfaz"

1. Motivación

  • En un sistema orientado a objetos, por algunas razones (por ejemplo, la sobrecarga de creación de objetos es muy alta, o algunas operaciones requieren control de seguridad, o requieren acceso fuera del proceso, etc.), el acceso directo traerá problemas al usuario o la estructura del sistema Muchos problemas.
  • ¿Cómo se puede administrar/controlar la complejidad inherente de estos objetos sin perder la transparencia de operar en los objetos? Agregar una capa de direccionamiento indirecto es una solución común en el desarrollo de software.

2. Definición del esquema

        Proporciona un proxy para que otros objetos controlen (aíslen, usen interfaces) el acceso a este objeto.

                                                                                                                ----《Patrones de diseño》GOF

3. Estructura

El cliente debe usar RealSubject. En circunstancias normales, el cliente debe declarar un puntero de asunto y luego un nuevo RealSubject, pero debido a ciertas restricciones de escena, como las consideraciones de seguridad mencionadas anteriormente o el control de acceso, no puede ir directamente a nuevo. Para esto objeto específico, en este momento, Proxy se puede usar para permitir que Cline genere un objeto Proxy, realice algunas operaciones adicionales en el Proxy y luego movilice la interfaz RealSubject. 

4. Ejemplo de código

Copia original:

        

class ISubject{
public:
    virtual void process();
};

class RealSubject : public ISubject{
public:
    virtual void process(){
     //...
     // ...   
    }
};


class ClientApp{
    ISubject *subject;
public:
    ClientApp()
    {
        subject = new RealSubject();
    }
    void DoTask(){
        // ...
        subject->process();
        // ...
    }
};

Pero por alguna razón, el sujeto no puede seguir directamente el camino del nuevo RealSubject

Código Ver2:

class SubjectProxy : public ISubject{
    ISubject *subject;
public:
    virtual void process(){
     //...
     // 对RealSubject的一种间接访问
     subject->process();
     // ...   
    }
};

class ClientApp{
    ISubject *subject;
public:
    ClientApp()
    {
        subject = new SubjectProxy();
    }
    void DoTask(){
        // ...
        subject->process();
        // ...
    }
};

En el código de muestra Ver2 anterior, el modo proxy mantiene un puntero RealSubject, pero en general, no se puede usar de esta manera, sino de una manera más complicada, pero esta forma de uso también es posible.

4. Resumen de los puntos principales

  • "Agregar una capa de direccionamiento indirecto" es una solución común para muchos problemas complejos en los sistemas de software. En un sistema orientado a objetos, el uso directo de algunos objetos causará muchos problemas, y el objeto proxy como una capa indirecta es un medio común para resolver este problema.
  • Los métodos de implementación y la granularidad del modo de proxy específico son muy diferentes (es decir, el método de proceso de SubjectProxy en el código ver2 anterior), algunos pueden tener un control detallado sobre un objeto, como la tecnología de copia en escritura, y algunos pueden proporcionar abstracción para módulos de componentes Capa de proxy, objetos de proxy a nivel de arquitectura

        (Algunos pueden proporcionar una capa de proxy abstracta para módulos de componentes y explicar el proxy de objetos a nivel de arquitectura: como los sistemas distribuidos, se utilizará una gran cantidad de modos de proxy. Por ejemplo, desea acceder a un servicio web. Este servicio web es, por ejemplo, el servicio web de Amazon. Acceda a él, incluida la muy popular arquitectura rust ahora, obtiene interfaces oxidadas, como algunas interfaces oxidadas de Sina, Weibo, amazon, WeChat, y accede a ellas en C ++, a menudo hay ciertas herramientas eso lo ayudará a generar una clase de proxy para esa interfaz en el lado del cliente. La clase de proxy a menudo no se escribe a mano, pero a menudo se implementa automáticamente mediante herramientas. La escritura manual es muy complicada porque tiene que controlar todos los detalles de acceso a la red)

  • El proxy no necesariamente requiere mantener la consistencia completa de la interfaz, siempre que se pueda lograr un control indirecto, a veces es aceptable dañar algo de transparencia

Supongo que te gusta

Origin blog.csdn.net/bocai1215/article/details/127642330
Recomendado
Clasificación