Передача сообщений между объектами. Как обратиться к целевому объекту?

StackOverflow https://stackoverflow.com/questions/99684

  •  01-07-2019
  •  | 
  •  

Вопрос

Самая основная задача в объектно-ориентированной среде — выполнение метода объекта.Для этого вам необходимо иметь ссылку на объект, для которого вы вызываете метод.Является ли правильный способ установить эту ссылку для передачи объекта в качестве параметра конструктору (или методу инициализатора) вызывающего объекта?

Если объект foo вызывает объект bar, правильно ли сказать (в псевдокоде):

bar = new barClass()
foo = new fooClass(bar)

Что произойдет, если вам нужно будет передавать сообщения туда и обратно?Вам нужен метод регистрации целевого объекта?

foo = new fooClass()
bar = new barClass()

foo.register(bar)
bar.register(foo)

Есть ли шаблон, который решает эту проблему?

Это было полезно?

Решение

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

Что делать, если вам нужен управляющий объект, для которого другие объекты регистрируют события.Тогда было бы целесообразно использовать метод Register (который может добавляться к делегату).

Видеть Модель наблюдателя

Другие советы

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

Ну, в зависимости от уровня обмена сообщениями, вы можете реализовать службу обмена сообщениями.Объекты прослушивают сообщения или регистрируются в качестве MessageListener в каком-либо MessageProvider.

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

Один из ваших типов объектов может быть фабрикой для другого.Когда Фу выкачивает новый Бар, соединение уже установлено:

foo = new Foo();
bar = Foo.Poop();

function Foo::Poop()
{
    bar = new Bar(this);
    myChildren.Add(bar);
    return bar;
}

bar.SayHiToParent();
foo.SayHiToChildren();

Я думаю, что это во многом зависит от того, каково точное отношение между двумя объектами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top