Муфта отсутствует, потому что кнопка ничего не знает о вашей конкретной реализации ButtonListener. И наоборот, ButtonListener мало что знает о Button. Интерфейс ButtonListener предоставляет только событие - инкапсулирование информации, которую вам нужно знать о том, что изменилось. Ваша реализация ограничена в понимании типа источника этого события. Таким образом, ваш слушатель и кнопка никогда напрямую не разговаривают друг с другом с помощью своих элементов API уровня класса, они только общаются друг с другом с точки зрения интерфейсов, которые они реализуют, - ButtonListener и Event. Вообще говоря, когда два класса общаются друг с другом через общий абстрактный API, они описываются как слабосвязанные - это означает, что ни один из них не зависит от конкретных для реализации деталей другой, и поэтому их внутренности могут меняться независимо.