在设计模式中,代理设计模式作为经常用到的一种开发模式,所以掌握代理设计对于每一个程序员来说尤其重要。
那么什么是代理设计模式呢,直白点来说,就是你拜托别人去帮你办一件事情,这就是一个代理模式,那个帮助你的人就是你的代理者。
如何设计一个代理模式呢?主要分为以下3步:
1.注册代理者
2.代理者实现协议
3.调用代理方法
以下是一个代理设计的实际案例:班长代替公司罚款
1.建立一个教师类:
Teacher.h 文件代码如下:
#import <Foundation/Foundation.h>
@interface Teacher : NSObject
@property (nonatomic,assign) BOOL isLate;
@end
Teacher.m 文件代码如下:
#import "Teacher.h"
@implementation Teacher
@end
2.建立一个学生类:
Student.h 文件代码如下:
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property (nonatomic,assign) BOOL isLate;
@end
Student.m 文件代码如下:
#import "Student.h"
@implementation Student
@end
3.建立一个公司类:
Company.h 文件代码如下:
#import <Foundation/Foundation.h>
@class Student;
@class Teacher;
@protocol CompanyDelegate <NSObject>
@required
- (void)studentisLate:(int)money;
- (void)teacherisLate:(int)money;
@optional
- (void)sayHi:(id)type;
@end
@interface Company : NSObject
@property (nonatomic,weak) id<CompanyDelegate> delegate;
@property (nonatomic,strong) Teacher *teacher;
@property (nonatomic,strong) Student *student;
- (void)perforProtocol;
@end
Companyt.m 文件代码如下:
#import "Company.h"
#import "Teacher.h"
#import "Student.h"
@implementation Company
- (void)perforProtocol {
if (self.teacher.isLate) {
if (self.delegate && [self.delegate conformsToProtocol:@protocol(CompanyDelegate)]) {
[self.delegate teacherisLate:50];
}
}else {
if ([self.delegate respondsToSelector:@selector(sayHi:)]) {
[self.delegate sayHi:self.teacher];
}
}
if (self.student.isLate) {
if ([self.delegate respondsToSelector:@selector(studentisLate:)]) {
[self.delegate studentisLate:10];
}
}else {
if ([self.delegate respondsToSelector:@selector(sayHi:)]) {
[self.delegate sayHi:self.student];
}
}
}
@end
4.建立一个班长类:
Monitor.h 文件代码如下:
#import <Foundation/Foundation.h>
#import "Company.h"
@interface Monitor : NSObject <CompanyDelegate>
@end
Monitor.m 文件代码如下:
#import "Monitor.h"
#import "Student.h"
#import "Teacher.h"
@implementation Monitor
- (void)studentisLate:(int)money {
NSLog(@"学生迟到了,罚款 %d ¥",money);
}
- (void)teacherisLate:(int)money {
NSLog(@"教师迟到了,罚款 %d ¥",money);
}
- (void)sayHi:(id)type {
if ([type isMemberOfClass:Student.class]) {
NSLog(@"student isn't late!");
}
if ([type isMemberOfClass:Teacher.class]) {
NSLog(@"teacher isn't late!");
}
}
@end
main.m 的文件代码如下:
#import <Foundation/Foundation.h>
#import "Teacher.h"
#import "Student.h"
#import "Company.h"
#import "Monitor.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Company *company = [Company new];
Student *student = [Student new];
Teacher *teacher = [Teacher new];
Monitor *monitor = [Monitor new];
company.delegate = monitor;
company.teacher = teacher;
company.student = student;
company.student.isLate = YES;
teacher.isLate = NO;
[company perforProtocol];
NSLog(@"结束标记");
}
return 0;
}
测试结果如下:
2015-08-08 16:19:35.383 DelegateDemo03[1063:81474] teacher isn't late!
2015-08-08 16:19:35.416 DelegateDemo03[1063:81474] 学生迟到了,罚款 10 ¥
2015-08-08 16:19:35.417 DelegateDemo03[1063:81474] 结束标记
以上就是一个代理设计模式!