Какова цель шаблона делегирования?
Я просматривал источник SensorManager в Android и обнаружил, что при регистрации SensorEventListener
SensorManager
передает управление прослушивателем на ListenerDelegate
.
Я приведу это только в качестве примера. Я читаю статью в Википедии о программировании делегатов, но я до сих пор не уверен в ее цели. Зачем использовать делегат? Как это помогает в управлении потоком программы? Каковы недостатки использования (или отсутствия) одного? Это наиболее практично для использования с слушателями?
Изменить: ListenerDelegate
находится в строке 487, и соответствующие методы находятся вокруг строки 1054.
Ответы
Ответ 1
Делегирование не является "шаблоном дизайна" в том смысле, который используется в книге GoF. Он полезен в ряде сценариев и является базой для других шаблонов
- если вы хотите выполнить некоторые дополнительные действия до/после делегирования (это шаблон Decorator, но он основан на делегировании). Например,
Collections.synchronizedList(..)
создает новую коллекцию, которая делегирует исходную, но имеет свои методы синхронизации.
- если у вас есть несовместимые интерфейсы, и вы хотите адаптировать их друг к другу (шаблон адаптера). Вы получаете исходный объект и делегируете его из методов, соответствующих желаемому интерфейсу. Например, существует класс
EnumerationIterator
, который адаптирует перечисления к интерфейсу Iterator
. Класс имеет метод hasNext()
, который делегирует enumeration.hasMoreElements()
- когда вы хотите скрыть некоторую сложность от пользователя вашего класса, вы можете иметь методы, которые делегируют разные фактические работники. Например,
Car
может иметь start()
, openWindow()
и brake()
, но каждый из этих методов фактически делегирует движок, el.windows и систему торможения (см. также это)
Ответ 2
Согласно эффективной Java (Джошуа Блоху), композиция благоприятна по сравнению с наследованием. Композиция имеет несколько преимуществ перед наследованием. Одна из интуиций для этого заключается в следующем: Рассмотрим подкласс, который наследуется от базового класса. Таким образом, любое изменение в базовом классе сделает подкласс непрочным, поскольку подкласс зависит от базового класса. Используя наследование, мы делаем привязку к подклассу в зависимости от базового класса, что делает наш код хрупким. Однако, используя композицию, мы можем удалить это ограничение. Композиция выполняется путем установления "has-a relationship" между классами вместо отношения "is-a", как в наследовании. "Модель делегирования" и "Декоратор" - оба примера того, как можно достичь композиции. Возможно, вы захотите прочитать главу "Композиция против наследования" в эффективной java-книге, так как она довольно информативна.
Для более короткого объяснения вы можете обратиться к этой статье: http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-java-oops-design.html
Ответ 3
Шаблон делегирования используется для того, чтобы кто-то действительно выполнял эту работу, поэтому, например, в вашем примере SensorManager
не будет знать, как делать то, что хочет каждый слушатель, но вы хотите, чтобы только одна программа прослушивала к датчику.
Итак, есть слушатели, созданные путем вызова registerListener
на SensorManager
, и эти слушатели передают информацию, а затем могут решить, что делать с данными с датчиков.