2008-09-19 3 views
2

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

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

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

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

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

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

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

ответ

2

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

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

См Observer Pattern

0

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

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

+0

Спасибо! Это имело бы смысл, если бы у вас были сообщения, на которые могли ответить многие объекты. Меня больше интересует общий случай, когда два объекта довольно тесно связаны и разговаривают друг с другом. Тип ООП-101. :) – 2008-09-19 04:58:51

3

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

+0

Спасибо! Я потратил немного времени на Весну, но не так много. Я определенно посмотрю глубже. – 2008-09-19 06:05:08

0

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

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

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

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

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

Смежные вопросы