У меня есть классы, которые должны общаться друг с другом. Проблема в том, что если вы создаете один из них, то другой (дочерние родительские отношения), тогда все становится сложным. Вам либо нужно передать экземпляр родителя в дочерний элемент (затем какой из них вы создаете первым, если используете инъекцию зависимостей), либо вы можете использовать делегаты/события. Но я хочу подчеркнуть тот факт, что родитель должен иметь возможность обрабатывать событие, которое повышает ребенок. Не слишком уверен, как это сделать. Я также не хочу использовать несколько подписчиков.Каков наилучший шаблон для двухсторонней связи между классами?
Отношения между родителем и ребенком просто чувствуют себя неправильно для двусторонней коммуникации. К сожалению, это не тот случай, когда один из объектов всегда инициируется, а другой отвечает. Любой может начать, а другой должен ответить.
Есть ли другой шаблон, который мне не хватает?
ОБНОВЛЕНИЕ: Простите, это довольно сложно объяснить. Я забыл добавить, что, когда один класс отправляет сообщение другому классу, он не ожидает ответа немедленно. Ответ приходит асинхронно, поэтому вам нужен экземпляр родителя для вызова правильного метода или делегата/события. Извините, пример ниже - псевдокод. Надеюсь, этого достаточно, чтобы понять эту идею. Должен ли я взглянуть на шаблон посредника.
public class Foo
{
public void SendMessageAToBar()
{
MessageA msg = new MessageA();
Bar.ReceiveMessageAFromFoo(msg);
}
public void ReceiveMessageARespFromBar(MessageAResp msgResp)
{
//Got a response do something
}
public void ReceiveMessageBFromBar(MessageB msg)
{
//Do something msg
MessageBResp msgBResp = new MessageBResp();
Bar.ReceiveMessageBRespFromFoo()
}
}
public class Bar
{
public void ReceiveMessageAFromFoo(MessageA msg)
{
//DO something.
MessageAResp resp = new MessageAResp();
Foo.ReceiveMessageARespFromBar(resp);
}
public void SendMessageBToFoo()
{
MessageB msg = new MessageB();
Foo.ReceiveMessageBFromBar(msg);
}
public void ReceiveMessageBRespFromFoo(MessageBResp msgResp)
{
//Got a response do something
}
}
Что нового в этом случае означает, что вы не хотите использовать события здесь? –
Можете ли вы добавить примеры кода для ребенка и родителя? – jgauffin
Возможно, это поможет, если вы опишете, какие фактические объекты вы имеете в виду как родители и дети. Это не всегда плохо, если у ребенка есть ссылка на родителя. Существует много случаев, таких как TreeView, XmlNode и т. Д., А также использование Observer - очень жизнеспособный вариант. Не уверен, почему вы говорите: «Я также не хочу, чтобы несколько подписчиков на мероприятие». Не могли бы вы это объяснить? –