首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 代理(委託)設計模式完整實作指南

     編輯:關於C語言

代理模式核心概念

代理模式讓一個物件(委託者)將特定任務交由另一個物件(代理者)執行,實現「兩個物件協同解決問題」的鬆耦合通訊。其優勢在於:

  • 簡化物件行為,降低類別間耦合度。
  • 無需子類化即可擴充功能。
  • 實作彈性高,易於維護與擴展。

租房子案例:真實角色與代理角色

房東(RealSubject)委託仲介(Proxy)處理租屋事宜,租客(Client)只與仲介互動。

代理模式結構圖

1. 定義協議

#import <Foundation/Foundation.h>

@protocol FindApartment <NSObject>
- (void)findApartment;
@end

2. 代理角色(仲介)

// Agent.h
#import <Foundation/Foundation.h>
#import "FindApartment.h"

@interface Agent : NSObject <FindApartment>
@end

// Agent.m
#import "Agent.h"

@implementation Agent
- (void)findApartment {
    NSLog(@"findApartment");
}
@end

3. 真實角色(房東/租客)

// Person.h
#import <Foundation/Foundation.h>
#import "FindApartment.h"

@interface Person : NSObject {
    NSString *_name;
    id<FindApartment> _delegate;
}
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) id<FindApartment> delegate;
- (id)initWithName:(NSString *)name withDelegate:(id<FindApartment>)delegate;
- (void)wantToFindApartment;
@end

// Person.m
#import "Person.h"

@interface Person()
- (void)startFindApartment:(NSTimer *)timer;
@end

@implementation Person
@synthesize name = _name;
@synthesize delegate = _delegate;

- (id)initWithName:(NSString *)name withDelegate:(id<FindApartment>)delegate {
    self = [super init];
    if (self) {
        self.name = name;
        self.delegate = delegate;
    }
    return self;
}

- (void)wantToFindApartment {
    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(startFindApartment:) userInfo:@"Hello" repeats:YES];
}

- (void)startFindApartment:(NSTimer *)timer {
    [self.delegate findApartment];
}
@end

4. 主程式測試

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"Hello, World!");
        Agent *agent = [[Agent alloc] init];
        Person *jack = [[Person alloc] initWithName:@"jack" withDelegate:agent];
        [jack wantToFindApartment];
        [[NSRunLoop currentRunLoop] run];
        [jack autorelease];
    }
    return 0;
}

執行結果截圖

此模式廣泛應用於 iOS 開發(如 UITableViewDelegate、UIScrollViewDelegate),是物件間通訊的基石。

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