Реализация шаблона проектирования связи подсистемы - PullRequest
1 голос
/ 17 февраля 2012

Я ищу подходящий шаблон проектирования для следующего:

У меня следующая структура системы:

MainApplication
    SubSystem1
    SubSystem2
    SubSystem3

Где MainApplication инициализирует каждую подсистему,

    SubSystem1 s1;
    SubSystem2 s2;
    SubSystem3 s3;

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

и каждая подсистема должна иметь возможность общаться друг с другом.

Как в каждой подсистеме я могу вызвать метод из другой подсистемы?Например, в s1

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

Будет ли здесь работать шаблон проектирования фасада?Если так, как это будет реализовано?Если нет, какой шаблон проектирования следует использовать для этого сценария?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Это в значительной степени зависит от типа связи между подсистемами.

Если это абстрактно, то есть подсистемам на самом деле не нужно знать друг о друге, может подойти механизм обмена сообщениями на основе публикации-подписки .См. https://en.wikipedia.org/wiki/Publish/subscribe для введения, но я думаю, что концепция должна быть довольно простой.

Если, с другой стороны, подсистемы действительно должны знать друг друга конкретным образом, почемуони подсистемы в первую очередь?Создание такого типа разделения означает, что действительно существует разделение задач, поэтому поиск абстрактного интерфейса не должен быть таким сложным.Если это так, возможно, вам следует пересмотреть свои подсистемные обязанности.

0 голосов
/ 17 февраля 2012

Я никогда не мог вспомнить названия шаблонов дизайна. Почему вы не можете позволить каждой подсистеме знать другие подсистемы?

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

Если вы хотите быть более устойчивыми к будущим изменениям, опишите интерфейс каждой подсистемы в interface и убедитесь, что SetSubsystemX использует этот интерфейс, а не конкретный класс.

РЕДАКТИРОВАТЬ: пример интерфейса.

Допустим, ваша первая подсистема знает, как отправить электронное письмо, а вторая подсистема знает, как напечатать файл. Вы должны объявить два интерфейса:

interface IEmailSubsystem
{
    void SendEmail(string content);
}

interface IPrintSubsystem
{
    void PrintFile(string path);
}

Затем вы можете определить два ваших объекта подсистемы:

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

Если вам когда-нибудь понадобится больше, чем 3 подсистемы, у вас должен быть глобальный реестр подсистем, но пока не беспокойтесь об этом.

...