Хорошие шаблоны для слабой связи в Java? - PullRequest
5 голосов
/ 22 марта 2010

Я новичок в Java, и пока читаю документацию, я не могу найти хороших способов для программирования со слабой связью между объектами. Для большинства языков, которые я знаю (C ++, C #, Python, JavaScript), я могу управлять объектами как имеющими «сигналы» (уведомление о чем-то происходит / что-то необходимо) и «слоты» (метод, который может быть связан с сигналом и обработать уведомление / do некоторые работы). На всех упомянутых языках я могу написать что-то вроде этого:

Object1 = new Object1Class();
Object2 = new Object2Class();
Connect( Object1.ItemAdded, Object2.OnItemAdded );

Теперь, если object1 вызывает / излучает ItemAdded, будет вызван метод OnItemAdded для Object2. Такая техника слабой связи часто упоминается как «делегаты», «сигнальный интервал» или «инверсия управления».

По сравнению с шаблоном интерфейса, упомянутая методика не требует группировки сигналов в некоторых интерфейсах. Методы любого объекта могут быть связаны с любым делегатом, если совпадают подписи (C ++ Qt даже расширяет это, разрешая только частичное совпадение подписи). Поэтому мне не нужно писать дополнительный интерфейсный код для каждого метода / группы методов, предоставлять реализацию по умолчанию для неиспользуемых методов интерфейса и т. Д.

И я не вижу ничего подобного в Java :(. Может, я смотрю не так?

Ответы [ 5 ]

6 голосов
/ 22 марта 2010

Вы должны посмотреть на классы Observable и Observer в java, чтобы достичь сигнального поведения.Основная идея состоит в том, чтобы заставить наблюдателя выполнить какое-либо действие при изменении наблюдаемого объекта. Классы - это java.util.Observable, объект которого вы должны отправить, сигнал должен быть расширен.

Интерфейс - это Java.util.Observer, который ваши классы-наблюдатели должны реализовать, чтобы воздействовать на сигнал

3 голосов
/ 22 марта 2010

AspectJ может дать вам поведение, которое вы ищете.Я не трогал его несколько лет, но помню, что он чертовски силен.Но если вы новичок в Java ... Я не собираюсь говорить "держись подальше", потому что эй, ты должен научиться когда-нибудь.Просто будь осторожен.Насколько я помню, AspectJ не просто дает вам достаточно веревки, чтобы повеситься;это дает вам достаточно, чтобы сперва повесить и повесить всю свою семью.Включая ваших кошек.

2 голосов
/ 31 июля 2012

Вы можете найти кучу информации о связывании модулей, так как для java я бы выделил следующие уровни связывания на уровне языка:

  1. Зависимость статического метода - высокая связь, пользовательский код знает о точной реализации
  2. Зависимость создания нового экземпляра (A создает экземпляр B и использует его поведение) - высокий, B не может быть заменен
  3. Зависимость отражения - высокая связь, A знает о точной реализации B
  4. Зависимость наследования (класс B расширяет A) - высокая связь, любое изменение в родительском классе влияет на подклассы
  5. Зависимость экземпляра класса (класс A имеет ссылку на экземпляр класса B) - средний, пользовательский код привязан к определенной иерархии классов, он средний, поскольку java не поддерживает множественное наследование
  6. Зависимость экземпляра интерфейса (класс A имеет ссылку на экземпляр интерфейса B) - низкая, поскольку java поддерживает реализацию нескольких интерфейсов.

Простой способ протестировать вашу реализацию с высокой связью - написать тесты для нее.

1 голос
/ 22 марта 2010

Вы можете иметь один объект для реализации подходящего EventListener, а другой объект может запускать такие события. См. Запись прослушивателей событий для получения дополнительной информации.

1 голос
/ 22 марта 2010

Одна возможность:

«Слоты» реализуют некоторый интерфейс, например ex INotifiable. Объекты сигнализации имеют список INotifiable объектов и метод void Register(INotifiable n).

Если вы хотите сообщить о слотах, выполните цикл по списку со всеми INotifialbes и вызовите метод события, который вы определяете сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...