首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 代理模式深度解析:改變控制鏈、解耦通信的核心機制

     編輯:程式設計綜合問答

核心定義

代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復雜度。

關鍵概念拆解

什麼是「控制鏈」?

在傳統繼承或直接調用中,調用者持有被調用者的具體引用(指針),形成強耦合的「控制鏈」:
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>,實現了解耦。

「改變或傳遞控制鏈」的實例

  • 改變:原本 View 直接調用 Model 保存數據,改為 View → Delegate(Controller) → Model,Controller 可攔截、驗證、轉發。
  • 傳遞:響應鏈是典型的代理鏈傳遞:Touch → View → Superview → ... → Window → Application,每個節點可選擇處理或傳遞給下一級。

代理模式三大優勢

  1. 解耦:發送者與接收者零依賴,僅共享協議。
  2. 單一職責:各類專注自身邏輯,通信細節交給代理。
  3. 動態替換:運行時可切換 delegate 對象(如測試用 Mock Delegate)。

總結

代理不是簡單的「傳值」,而是架構層面的控制權轉移。通過協議定義契約,將「誰來處理」的決定權從調用者移交給遵守協議的對象,實現框架級的靈活性與可擴展性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved