Pregunta

Estoy buscando un patrón de diseño apropiado para lo siguiente:

Tengo la siguiente estructura del sistema:

MainApplication
    SubSystem1
    SubSystem2
    SubSystem3

Donde la aplicación principal inicializa cada subsistema,

    SubSystem1 s1;
    SubSystem2 s2;
    SubSystem3 s3;

    public MainApplication()
    {
        s1 = new SubSystem1();
        s2 = new SubSystem2();
        s3 = new SubSystem3();
    }

y cada subsistema debería poder comunicarse entre sí.

Dentro de cada subsistema, ¿cómo puedo llamar a un método desde otro subsistema? Por ejemplo en s1

    public SubSystem1()
    {
        s2.Method1();
        s3.Method2();
    }

¿Funcionaría un patrón de diseño de fachada aquí? Si es así, ¿cómo se implementaría? Si no, ¿qué patrón de diseño debe usarse para este escenario?

¿Fue útil?

Solución

Esto depende más o menos del tipo de comunicación entre los subsistemas.

Si es abstracto, es decir, los subsistemas en realidad no tienen que saber unos de otros, un Publicar mecanismo de mensajería basado en suscripción puede ser apropiado. Ver https://en.wikipedia.org/wiki/publish/subscribe Para una introducción, pero creo que el concepto debería ser bastante sencillo.

Si, por otro lado, los subsistemas realmente tienen que conocerse de manera concreta, ¿por qué son subsistemas en primer lugar? Hacer este tipo de partición indica que de hecho existe una separación de preocupaciones, por lo que encontrar una interfaz abstracta no debería ser tan difícil. Si es así, tal vez debería reconsiderar sus responsabilidades del subsistema.

Otros consejos

Nunca pude recordar nombres de patrones de diseño. ¿Por qué no puede hacer que cada subsistema conozca los otros subsistemas?

s1.SetSubsystem2(s2);
s1.SetSubsystem3(s3); 
...

Si desea ser más resistente al cambio de futuro, describa la interfaz de cada subsistema en un interface, y asegúrese de que SetSubSystemX tome esa interfaz, y no la clase concreta.

Editar: un ejemplo de interfaz.

Supongamos que su primer subsistema sabe cómo enviar un correo electrónico, y el segundo subsistema sabe cómo imprimir un archivo. Debes declarar dos interfaces:

interface IEmailSubsystem
{
    void SendEmail(string content);
}

interface IPrintSubsystem
{
    void PrintFile(string path);
}

Entonces puede definir sus dos objetos del subsistema:

class Subsystem1: IEmailSubsystem ...
class Subsystem2: IPrintSubsystem ...

Si alguna vez va a terminar necesitando más que los 3 subsistemas, debe tener un registro de subsistema global, pero no se preocupe por ello todavía.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top