Какова цель шаблона делегирования? - PullRequest
41 голосов
/ 24 августа 2011

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

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

Редактировать: ListenerDelegate находится на строке 487, а рассматриваемые методы - на строке 1054.

Ответы [ 3 ]

58 голосов
/ 24 августа 2011

Делегирование не совсем «шаблон проектирования» в том смысле, в каком оно используется в книге GoF. Это полезно в ряде сценариев и является основой для других шаблонов

  • когда вы хотите выполнить некоторые дополнительные действия до / после делегирования (это шаблон Decorator, но он основан на делегировании). Например, Collections.synchronizedList(..) создает новую коллекцию, которая делегирует исходную, но имеет синхронизированные методы.
  • когда у вас несовместимые интерфейсы, и вы хотите адаптировать один к другому (шаблон адаптера). Вы получаете исходный объект и делегируете ему методы, которые соответствуют желаемому интерфейсу. Например, есть класс EnumerationIterator, который адаптирует перечисления к интерфейсу Iterator. В классе есть метод hasNext(), который делегирует enumeration.hasMoreElements()
  • когда вы хотите скрыть некоторую сложность от пользователя вашего класса, у вас могут быть методы, которые делегируют различным фактическим работникам. Например, Car может иметь start(), openWindow() и brake(), но каждый из этих методов фактически делегирует движку, el.windows и тормозной системе ( см. Также этот )
15 голосов
/ 24 мая 2015

В соответствии с эффективной Java (Джошуа Блох), состав является более предпочтительным, чем наследование.Композиция имеет несколько преимуществ по сравнению с наследованием.Одна из интуиций для этого заключается в следующем: рассмотрим подкласс, который наследуется от базового класса.Таким образом, любое изменение в базовом классе сделает подкласс хрупким, так как подкласс зависит от базового класса.Используя наследование, мы делаем привязку к подклассу в зависимости от базового класса, что делает наш код хрупким.Однако, используя композицию, мы можем снять это ограничение.Композиция выполняется путем установления отношения «имеет-отношение» между классами вместо отношения «есть-а», как в наследовании.«Шаблон делегата» и «Шаблон декоратора» являются примерами того, как можно добиться композиции.Возможно, вы захотите прочитать главу «Состав против наследования» в эффективной книге Java, поскольку она довольно информативна.

Для краткого объяснения, вы можете обратиться к этой статье: http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-java-oops-design.html

4 голосов
/ 24 августа 2011

Шаблон делегата используется для того, чтобы кто-то еще фактически выполнял работу, поэтому, например, в вашем примере SensorManager не будет знать, как делать то, что хочет каждый слушатель, но вы хотите, чтобы только одна программа слушалак датчику.

Итак, есть слушатели, созданные с помощью вызова registerListener на SensorManager, и эти слушатели передают информацию и затем могут решить, что делать с данными от датчиков.

...