Не все абстракции кодирования имеют реальный эквивалент. Например, вам будет трудно найти реальную аналогию с постраничной памятью. Поэтому вместо того, чтобы проводить реальные аналогии, я просто приведу вам реальный пример того, зачем они вам нужны.
Перво-наперво, фактическое определение глагола для делегирования (из Оксфордского словаря):
поручить (задачу или ответственность)
другой человек, обычно тот, кто
менее старшего, чем он сам: он
делегаты рутинных задач | сила
делегировать ему никогда не должно быть
злоупотребляют.
Делегаты - это объекты, которым делегированы полномочия, потому что с точки зрения дизайна не имеет смысла, чтобы один класс выполнял всю работу.
Допустим, у вас есть класс таблицы пользовательского интерфейса. Вы хотите сделать его многоразовым для отображения многих видов данных: по большей части это означает, что вы не можете привязать его к самой модели. Например, если вы создали свою таблицу пользовательского интерфейса специально для отображения объектов альбома (с именем, исполнителем и т. Д.), То вы не сможете повторно использовать ее для отображения, скажем, объектов файлов (с владельцем, типом документа). и т. д.): вам нужно отредактировать класс, чтобы он подходил. Это скопирует много кода, поэтому вы должны найти другой механизм. Это приводит к проблеме: как он может отображать любые данные, если ему не разрешено связываться с классами данных?
Решение состоит в том, чтобы разделить ответственность за получение данных и их отображение. Поскольку вашей таблице нужны данные для ее отображения, но она не может обнаружить ее сама, потому что ничего не знает о вашей модели, она должна делегировать эту ответственность другому классу, специально созданному для этой цели, и передать его информация в общем виде, которую таблица будет знать, как использовать.
Это означает, что у вас будет другой класс, который будет реагировать на определенное количество методов, которые объект таблицы будет использовать, как если бы он был частью его основного поведения (например, метод в делегате для получения имени столбцы, другой для получения определенной строки и т. д.). В качестве конкретного примера вы можете найти справочную информацию по протоколу NSTableViewDelegate
: это методы, которые NSTableView
может вызывать для своего делегата для получения информации о различных вещах или настраиваемом поведении. (Аргумент tableView:
, в основном, у каждого метода есть табличное представление, вызывающее метод. Он часто игнорируется, поскольку существует много классов делегатов табличного представления, поддерживающих одно табличное представление.)
Делегаты - это объекты, которые просто "знают лучше". Ваша таблица пользовательского интерфейса не имеет ни малейшего понятия, как получить то, что ей нужно, но у нее есть делегат, который «знает лучше», поэтому он может запрашивать данные из него.
Вы также можете использовать этот шаблон для обработки событий: например, при щелчке по представлению он не знает, что делать, но, возможно, у него есть делегат, который знает, что делать.
Другими словами, делегаты - это один из немногих способов расширения поведения класса без его изменения или подкласса.