代理设计模式以及书写规范

一、基本概念

设计模式(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真正的导入一个协议的声明

 

posted @ 2016-04-26 17:19  hissia  阅读(449)  评论(0编辑  收藏  举报