Они действительно на разных уровнях.
Класс, который использует делегат, - это класс (любой класс), разработанный таким образом, что пользовательское поведение может быть предоставлено другим объектом, а не, скажем, путем создания подклассов.
например, большинство приложений Какао захотят сделать что-то особенное при запуске приложения (довольно скучно, если они этого не сделали). Вместо того, чтобы требовать от каждого приложения Cocoa реализации собственного подкласса NSApplication
только для переопределения –applicationWillFinishLaunching:
, NSApplication
спроектирован так, что если вы установите свойство delegate
для действительного объекта, и у этого объекта будет метод –applicationWillFinishLaunching:
это будет называть это.
Таким образом, вы можете использовать любой класс, который вам нравится, для вашей установки, вам не нужно делать его подклассом NSApplication.
Многие классы какао работают так, что означает, что вам вряд ли когда-нибудь придется создавать подклассы для добавления собственного поведения. В некоторых других языках и средах способ, которым вы должны добавить свое пользовательское поведение, заключается в создании подклассов. Хотите пользовательскую кнопку в Java? Просто создайте новый класс, который расширяет JComponent и реализует MouseListener, затем переопределяет mouseClicked и т. Д. Это не способ Какао.
Контроллер, как вы знаете, является Объектом, ответственным за координацию Модели и Представления.
Как это бывает, если вам нужно добавить пользовательское поведение к экземпляру объекта модели или объекта представления - скажем, например, у вас есть объект NSTableView, и вы хотите добавить пользовательское поведение при выборе строки - вы, вероятно, уже иметь собственный объект Controller, и это часто идеальное место для размещения кода. Просто установите TableView's.delegate = controller. здесь мы видим, что tableView имеет метод делегата - tableViewSelectionDidChange:
Вам не нужно создавать подкласс NSTableView.
Я не считаю, что это означает, что делегат и контроллер - это одно и то же.