Подтвердить что ты не робот

Какова цель шаблона делегирования?

Я просматривал источник SensorManager в Android и обнаружил, что при регистрации SensorEventListener SensorManager передает управление прослушивателем на ListenerDelegate.

Я приведу это только в качестве примера. Я читаю статью в Википедии о программировании делегатов, но я до сих пор не уверен в ее цели. Зачем использовать делегат? Как это помогает в управлении потоком программы? Каковы недостатки использования (или отсутствия) одного? Это наиболее практично для использования с слушателями?

Изменить: ListenerDelegate находится в строке 487, и соответствующие методы находятся вокруг строки 1054.

4b9b3361

Ответ 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, и эти слушатели передают информацию, а затем могут решить, что делать с данными с датчиков.