идея
смотрите, вы создаёте объект "Кнопка" и этот объект может изменять своё состояние (нажата кнопка да\нет это и есть состояние). Другие программисты в других проектах будут использовать ваш объект "Кнопка", и эти программисты хотят что бы при изменение состояния что то происходило. При этом вы не знаете что именно должно происходить во всех этих проектах (это знают только их разработчики).
как это можно сделать?убогая банальщина: вы делаете метод
.получитьТекущееСостояние() и другие программисты в каком-то цикле опрашивают вашу кнопку через этот метод, да ещё и хранят предыдущее состояние (надо же с чем то сравнивать). Как видите довольно убого... пользователю-программисту нужно писать кучу кода с проверками и в добавок тратить впустую память и время процессора (то есть программа лагает и жрёт дохрена ресурсов...).
нормальная реализация: пусть сама кнопка вызывает нужные действия, веть она же знает когда её состояние изменилось. Значит кнопка должна вызывать какую-то функцию но при этом не знать что именно эта функция должна делать. Вот тут и приходят на помощь интерфейсы и паттерны проектирования в данном случае Listeners (aka Observers). Вот как раз OnClickListener это и есть интерфейс. Что касается кнопки то она хранит список объектов которые нужно уведомить при изменении состояния, тип этих объектов "OnClickListener". Таким образом "Кнопке" плевать "что где и как" должно происходить при изменении состояния, но при этом она обеспечивает возможность выполнения этого "что где и как" и при этом гарантирует что не произойдёт ошибки из за отсутствия вызываемого метода.
ru.wikibooks.org/wiki/Java/Listeners citforum.ru/SE/project/pattern