Я никогда не мог вспомнить названия шаблонов дизайна. Почему вы не можете позволить каждой подсистеме знать другие подсистемы?
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 подсистемы, у вас должен быть глобальный реестр подсистем, но пока не беспокойтесь об этом.