Каков наилучший шаблон для двусторонней связи между классами?

У меня есть классы, которым нужно взаимодействовать друг с другом. Проблема в том, что если вы заставите одно содержать другое (отношения между дочерними и родительскими элементами), тогда все станет сложно. Вам нужно либо передать экземпляр родительского элемента дочернему (а затем, какой из них вы создадите первым, если вы используете инъекцию зависимостей), либо вы можете использовать делегаты / события. Но я хочу закрепить тот факт, что родитель должен иметь возможность обрабатывать событие, вызываемое дочерним элементом. Не знаю, как это сделать. Я тоже не Я не хочу, чтобы на мероприятие было несколько подписчиков.

Отношения между родителями и детьми кажутся неправильными для двустороннего общения. К сожалению, это не тот случай, когда один из объектов всегда инициируется, а другой отвечает. Один из них может инициировать, а другой должен ответить.

Есть ли еще один шаблон, который мне не хватает?

ОБНОВЛЕНИЕ: Извините, это довольно сложно объяснить. Я забыл добавить, что когда один класс отправляет сообщение другому классу, он не ожидает немедленного ответа. Ответ приходит асинхронно, поэтому вам нужен либо экземпляр родителя для вызова правильного метода, либо делегат / событие. Извините, приведенный ниже пример является псевдокодом. Надеюсь, этого достаточно, чтобы понять идею. Стоит ли мне взглянуть на шаблон посредника.

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
        }
    }
5
задан uriDium 14 December 2010 в 09:26
поделиться