Регистрация соединенных объектов

Иногда Вам может понадобиться провести регистрацию всех объектов, соединенных с данным объектом посредством портов. Это может использоваться впоследствии для "прямого общения" этих активных объектов: если у объекта есть список соединенных с ним объектов, то он может напрямую взаимодействовать с этими объектами, вызывая функции этих объектов, изменяя значения их параметров и т.д. Список соединенных объектов может быть использован и в качестве списка адресов при адресации сообщений каким-то определенным получателям.  

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

 Чтобы реализовать регистрацию соединенных объектов

  1. Давайте проиллюстрируем этот подход на простейшем примере. Скажем, в Вашей модели есть набор вложенных объектов типа MyClass, чьи порты как-то графически соединены (см. рисунок ниже), и Вы хотите, чтобы у каждого объекта был список соединенных с ним объектов.

  
  1. Создайте Java класс RegMsg, экземпляры которого будут представлять в модели регистрационные сообщения. Создайте у класса поле object типа ActiveObject для хранения в сообщении ссылки на активный объект. (Создание Java классов описано здесь). 
  2. Создайте коллекцию в классе активного объекта MyClass для хранения информации о соединенных с данным объектом объектах. Назовите ее, например, connectedObjects. Задайте ActiveObject в качестве Типа элементов коллекции.
  3. Создайте Ваш собственный класс порта MyPort и сделайте порт Вашего активного объекта экземпляром этого класса, как описано здесь
  4. В открывшемся Java редакторе введите код созданного класса порта, как показано на рисунке ниже:

Давайте изучим только что введенный код. Вначале идет конструктор класса, который по сути вызывает стандартный конструктор базового класса Port.

Метод receive()вызывается при получении сообщения. Здесь происходит проверка типа прибывшего сообщения. Если это регистрационное сообщение, то его отправитель будет добавлен в список соединенных объектов (наша коллекция connectedObjects). Если нет - то сообщение продолжит обрабатываться в соответствии с логикой модели. 

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

  1. Введите следующую строку в поле Действие при запуске класса MyClass, чтобы при создании объекта вызывался  метод его порта register():
    port.register();

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

Объект может иметь несколько портов. В этом случае Вам нужно будет составить список соединенных с портом портов, а не объектов, чтобы иметь возможность различать сообщения, приходящие от разных портов одного объекта. Чтобы реализовать регистрацию портов, нужно сделать незначительные изменения в описанном выше механизме: Ваш класс порта должен иметь поле port типа MyPort, и метод register() должен посылать ссылку не на активный объект, а на сам порт-отправитель, которую можно получить с помощью оператора this.