По умолчанию сообщения, посланные из порта, автоматически пересылаются во все соединенные с этим портом порты. Но если нужно, Вы можете отсылать сообщения не всем, а только определенным получателям. Для этого нужно указывать в сообщении адрес объекта-получателя, а в портах-получателях производить фильтрацию сообщений, принимая только те сообщения, адрес которых будет равен адресу этого объекта.
Очевидно, что для этого объект, посылающий сообщения, должен иметь список адресатов. Есть несколько способов составления такого списка. Чуть более простым является создание списка на этапе создания модели. Но этот подход не применим к масштабируемым моделям, поскольку при каждом добавлении или удалении объекта Вам придется вручную изменять Ваш список. Если Вы хотите создать масштабируемую модель, то проще будет составить список во время работы модели с помощью отсылки идентификационных сообщений. Это может быть сделано с помощью нашего механизма регистрации соединенных объектов, когда при запуске модели объекты обмениваются сообщениями, содержащими их идентификаторы. Порт, получивший такое сообщение, извлекает информацию о пославшем это сообщение объекте и добавляет ее в список соединенных объектов
Чтобы отсылать сообщения только каким-то определенным получателям
public
void receive( Object msg ) {
if(
msg instanceof
RegMsg ){
RegMsg rm = (RegMsg)msg;
((MyClass)getActiveObject()).connectedObjects.add( rm.object
);
super.receive(
msg );
}
else
{
InfoMsg im = (InfoMsg)msg;
if
(im.address == getActiveObject()) {
return
true; //принять сообщение
}
else return
false; //не принимать сообщение
}
}
Теперь порты будут производить проверку адреса назначения поступающих сообщений. Если адрес будет соответствовать активному объекту - владельцу этого порта, то порт примет это сообщение. Иначе сообщение будет проигнорировано.
В дополнительном коде класса активного объекта Вы можете создать метод, реализующий посылку сообщений только определенному получателю: