你的位置:首页 > 操作系统

[操作系统]自学iOS开发小功能之五:代理设计模式以及书写规范


一、基本概念

设计模式(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 //学生需要代理,注意用id12 @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 LinkHome4 - (void)studentFindHouse:(Student *)student5 {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     //学生找到LinkHome10     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真正的导入一个协议的声明