代理模式讓一個物件(委託者)將特定任務交由另一個物件(代理者)執行,實現「兩個物件協同解決問題」的鬆耦合通訊。其優勢在於:
房東(RealSubject)委託仲介(Proxy)處理租屋事宜,租客(Client)只與仲介互動。

#import <Foundation/Foundation.h> @protocol FindApartment <NSObject> - (void)findApartment; @end
// 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
// 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
#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),是物件間通訊的基石。