代理设计模式以及书写规范
一、基本概念
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
代理设计模式:我们买电饭锅之类的,不会亲自到厂家去买,而是在商超等地方购买,而商超就是厂家的代理
应用场合:1、对象B想监听对象A的行为,让对象B成为对象A的代理
2、对象A发生的事想告知对象B,让对象B成为对象A的代理
3、对象A无法处理某些行为的时候,让对象B帮忙处理,即让对象B成为对象A的代理
二、代码
Student.h
1 #import <Foundation/Foundation.h> 2 //声明一个协议 3 @class Student; //此处别落下 4 @protocol StudentProtocol <NSObject> 5 - (void)studentFindHouse:(Student *)student;//此处注意传递student 6 @end 7 8 @interface Student : NSObject 9 //学生需要找房子 10 - (void)findHouse; 11 //学生需要代理,注意用id 12 @property (strong, nonatomic)id<StudentProtocol> delegate; 13 14 @end
Student.m
#import "Student.h" @implementation Student - (void)findHouse { NSLog(@"学生想找房子"); //通知代理帮忙找房子,前提是拥有找房子的能力 if ([self.delegate respondsToSelector:@selector(studentFindHouse:)]) { [self.delegate studentFindHouse:self]; } } @end
LinkHome.h
1 #import <Foundation/Foundation.h> 2 #import "Student.h" //此处本应该写@protocol StudentProtocol会更规范和好看一些,但不知道为啥会有警告找不到代理,不过程序正常运行 3 @interface LinkHome : NSObject <StudentProtocol> //遵守代理 4 @end
LinkHome.m
1 #import "LinkHome.h" 2 #import "Student.h" 3 @implementation LinkHome 4 - (void)studentFindHouse:(Student *)student 5 { 6 //必须实现代理的方法 7 NSLog(@"%s 帮忙找房子 ",__FUNCTION__); 8 } 9 @end
main.m
1 main.m 2 #import <Foundation/Foundation.h> 3 #import "Student.h" 4 #import "LinkHome.h" 5 int main(int argc, const char * argv[]) { 6 @autoreleasepool { 7 Student *st = [[Student alloc] init]; 8 LinkHome *lh = [[LinkHome alloc] init]; 9 //学生找到LinkHome 10 st.delegate = lh; 11 12 [st findHouse]; 13 } 14 return 0; 15 }
结果
2016-04-26 17:06:19.689 代理设计模式练习[4151:676544] 学生想找房子 2016-04-26 17:06:19.689 代理设计模式练习[4151:676544] -[LinkHome studentFindHouse:] 帮忙找房子 Program ended with exit code: 0
三、代理模式的书写规范
1.一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中。
2.协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol。
3.协议中的方法名称一般以协议的名称protocol之前的作为开头。
4.一般情况下协议中的方法会将触发该协议的对象传递出去
5.一般情况下一个类中的代理属于的名称叫做 delegate
6.当某一个类要成为另外一个类的代理的时候, 一般情况下在.h中用@protocol 协议名称;告诉当前类 这是一个协议。 在.m中用#import真正的导入一个协议的声明