Каково различие между источником данных и делегатом?

Мне связали фундаментальный вопрос с шаблонами разработки платформ Какао.

Каково различие между делегатом и источником данных?

Они оба могли использовать @protocols объявление, но некоторые классы или платформы используют delegate, и некоторые другие используют datasource.

Все я могу понять от UI/NSTableView delegate ответьте на связанные с UI события, в то время как datasource просто связан с данными. Но, я не знаю реализаций источника данных вне классов UI Какао.

Примечание:

  • Делегат, которого я упомянул в этом вопросе, не всегда связывается с событиями UI.
  • На вопрос источника данных ответили.
41
задан rptwsthi 12 March 2016 в 08:39
поделиться

2 ответа

Модели делегата и источника данных в значительной степени независимы и ортогональны:

Модель делегата очень распространена в Cocoa и позволяет делегату (любому экземпляру, реализующему неформальный протокол делегата до OS X 10.6, или формальный делегат @protocol в 10.6 и более поздних версиях) изменять поведение экземпляра объекта. Этот паттерн часто используется вместо подклассификации: вместо подклассификации класса для изменения его поведения вы предоставляете делегат, который отвечает на соответствующие методы. Классы, использующие делегаты, посылают сообщения своему делегату при наступлении определенных событий. API между классом и делегатом определяется классом и отличается для каждого класса, использующего паттерн, но API обычно состоит из сообщений, запрашивающих делегата, как обработать определенное событие. Одним из преимуществ паттерна делегата перед подклассированием является то, что класс может реализовать несколько протоколов делегата, что позволяет его экземплярам действовать в качестве делегата для нескольких классов. Аналогично, экземпляр объекта может быть делегатом для нескольких других объектов (поэтому большинство API делегатов передают объект в качестве первого аргумента для каждого сообщения в API). Шаблон делегата не так распространен в других UI-фреймворках (хотя Qt использует шаблон делегата в своем фреймворке Model/View), и не является тем же самым, что и делегаты .Net/CLR, которые по сути являются типизированными указателями функций.

Шаблон источника данных часто используется подклассами NSView в Cocoa, которые имеют сложные данные состояния, такие как NSBrowser, NSTableView, NSOutlineView и т. д. Протокол источника данных определяет API, который экземпляры этих (и других) классов могут использовать для получения данных для отображения в представлении. Хотя архитектуры NSController и Cocoa Bindings заменили многие виды использования паттерна источника данных, он по-прежнему распространен и очень мощный. Как и в описанном выше паттерне делегата, часть его возможностей обусловлена тем, что объект может выступать в качестве источника данных для нескольких экземпляров, использующих источники данных (и, возможно, даже для экземпляров нескольких классов, имеющих различные протоколы источников данных). Модель источника данных широко используется в других UI-фреймворках, таких как Qt (в рамках Model/View, где модель аналогична источнику данных) и WPF/Silverlight (где источник данных может быть более близким аналогом модели представления).

34
ответ дан 27 November 2019 в 00:20
поделиться

Источник данных предоставляет данные, делегат - поведение.

В MVC источник данных находится на уровне модели, а делегат - на уровне управления.

На самом деле, если подумать, источником данных обычно является контроллер, который находится ниже, ближе к модели. Не думаю, что я когда-либо использовал объект модели в качестве источника данных.

46
ответ дан 27 November 2019 в 00:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: