Передача сообщений между объектами - Как ссылаться на целевой объект? - PullRequest
2 голосов
/ 19 сентября 2008

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

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

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

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 19 сентября 2008

Инфраструктуры внедрения зависимостей, такие как Spring и Guice , обеспечивают решение циклических зависимостей в Java с помощью прокси-серверов, которые могут разрешать приемник сообщения в первый раз, когда это требуется. Однако это не является общепринятым шаблоном ОО.

2 голосов
/ 19 сентября 2008

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

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

См. Шаблон наблюдателя

0 голосов
/ 19 сентября 2008

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

0 голосов
/ 19 сентября 2008

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

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

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

bar.SayHiToParent();
foo.SayHiToChildren();
0 голосов
/ 19 сентября 2008

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

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

...