代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復雜度。
在傳統繼承或直接調用中,調用者持有被調用者的具體引用(指針),形成強耦合的「控制鏈」:
A → B → C(A 直接控制 B,B 直接控制 C)。
代理模式通過協議斷開這條鏈:
A → Protocol → B(A 僅知協議,不知 B 具體類)。
場景:TableView 需要通知 Controller 某行被點擊。
無代理:TableView 需 import Controller.h,持有 Controller *controller,調用 [controller rowSelected:index]。耦合度極高,TableView 無法復用。
有代理:
@protocol TableViewDelegate <NSObject>
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
@end
@interface MyTableView : UITableView
@property (weak) id<TableViewDelegate> delegate;
@end
// Controller 遵守協議並實現方法
// TableView 只調用 [delegate tableView:self didSelectRowAtIndexPath:indexPath];
// TableView 完全不知 Controller 存在,只知 delegate 符合協議
至此,TableView 不持有 Controller 指針,只持有遵守協議的 id<TableViewDelegate>,實現了解耦。
Touch → View → Superview → ... → Window → Application,每個節點可選擇處理或傳遞給下一級。代理不是簡單的「傳值」,而是架構層面的控制權轉移。通過協議定義契約,將「誰來處理」的決定權從調用者移交給遵守協議的對象,實現框架級的靈活性與可擴展性。