A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这几天楼主等开学,没事干预习了一下就业班的课程。发现代理模式在UI设计中用的非常多,今天特意复习一下。顺便给对这种模式理解的不到位的同学讲解一下具体步骤。。
<1>代理模式什么时候用?  1. A想告诉B一些事情   2. A想让B帮忙做某些事  3. B想监听A
这么说可能有的同学问了,我让A和B成为依赖关系或者组合关系不也行吗? OK,行是行,但是我们iOS设计的原则是低耦合高聚合。当有一天领导说要改项目,我不要这个功能了或者再加个功能。好吧,属性得改,方法得改,哐哐一顿改。 代理模式就省事多啦,我只要定义个协议,拥有一个协议属性,别的类只要遵守了这个协议就能为我做好多事情。是不是这个理儿呢?
<2>命名规范: 1. 协议名:  CZ+被代理类名+Delegate
                        2.协议属性 id <协议名> delegete
                        3.协议方法: 起一个有意义的名字,最好把被代理对象作为形参
<3>下面我们以小明找中介租房子为例,写个代码演示一下具体步骤
  1. //被代理类(小明)
  2. #import <Foundation/Foundation.h>
  3. @class CZPerson;
  4. // 第一步:定义代理协议
  5. @protocol  CZPersonDelegate  <NSObject>
  6. // 协议方法
  7. @optional
  8. - (void) findPersonHouse:(CZPerson *)person;
  9. @end

  10. @interface CZPerson :NSObject
  11. @property (nonatomic,copy) NSString *name;
  12. // 第二步:定义协议属性
  13. @property (nonatomic,weak) id<CZPersonDelegate> delegate;
  14. // 第三步:定义被代理对象要做的事情
  15.   -(void) zufang;
  16.   @end
  17.   
  18. @implementation CZPerson
  19. -(void) zufang
  20. {
  21.       NSLog(@"%@要租房子",self.name);
  22.           //第四步:给代理发送消息(先判断代理是否响应了协议方法)
  23.       if([self.delegate respondsToSelector:@selector(findPersonHouse:)]){
  24.            [self.delegate findPersonHouse:self];
  25.        }
  26. }

  27. @end
复制代码
  1. #import <Foundation/Foundation.h>
  2. @import "CZPerson"
  3. //代理类(中介)注意要遵守代理协议
  4. @interface CZZhongjie :NSObject <CZPersonDelegate>

  5. @end

  6. @implementation CZZhongjie
  7. // 第五步:实现协议方法
  8. - (void) findPersonHouse:(CZPerson *)person
  9. {
  10.        NSLog(@"帮%@找到了房子",person.name);
  11. }
复制代码
  1. // 测试主函数
  2. #import <Foundation/Foundation.h>
  3. #import "CZPerson"
  4. #import "CZZhongjie"

  5. int main(int argc,const char *argv[]){
复制代码


1 个回复

倒序浏览
  1. // 测试主函数
  2. #import <Foundation/Foundation.h>
  3. #import "CZPerson"
  4. #import "CZZhongjie"

  5. int main(int argc,const char *argv[]){
  6.         CZPerson * person = [[CZPerson alloc] init];
  7.         CZZhongjie * zj = [[CZZhongjie alloc] init];
  8.         person.name = @"小明";
  9.         //第六步:为代理属性赋值
  10.         person.delegate = zj;
  11.         // 第七步:调用方法
  12.         [person zufang];
  13. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马