黑马程序员技术交流社区

标题: OC学习笔记12--protocol的使用场景之代理模式 [打印本页]

作者: wowthe1st    时间: 2015-8-4 15:05
标题: OC学习笔记12--protocol的使用场景之代理模式
使用有java和C基础同学迅速了解OC
  1.        
  2. #import <Foundation/Foundation.h>

  3. // 定义 作为Invoker代理 需要遵守的协议
  4. @protocol InvokerDelegate <NSObject>
  5. - (void)invoke;
  6. @end


  7. // Invoker
  8. @interface Invoker :NSObject <InvokerDelegate>
  9. {
  10.         // 限定为只要遵守了该协议的任何类都能作为代理
  11.         id<InvokerDelegate> _delegate;
  12. }
  13. - (void)setDelegate:(id<InvokerDelegate>) delegate;
  14. - (id)initWithDelegate:(id<InvokerDelegate>)delegate;
  15. + (id)invokerWithDelegate:(id<InvokerDelegate>)delegate;
  16. @end

  17. @implementation Invoker

  18. + (id)invokerWithDelegate:(id<InvokerDelegate>)delegate
  19. {
  20.         return [[[self alloc] initWithDelegate:delegate] autorelease];
  21. }

  22. - (void)dealloc
  23. {
  24.         NSLog(@"%@ deallocated",[self className]);
  25.         // InvokerDelegate 遵守基协议后,编译器便知道
  26.         // id<InvokerDelegate>类型变量拥有基协议中的方法
  27.         [_delegate release];
  28.         [super dealloc];
  29. }
  30. - (void)setDelegate:(id<InvokerDelegate>) delegate
  31. {
  32.         if(delegate!=_delegate)
  33.         {
  34.                 [_delegate release];
  35.                 _delegate=[delegate retain];
  36.         }
  37. }
  38. - (id)initWithDelegate:(id<InvokerDelegate>)delegate
  39. {
  40.         if(self=[super init])
  41.         {
  42.                 [self setDelegate:delegate];
  43.         }
  44.         return self;
  45. }

  46. -(void)invoke
  47. {
  48.         // 方法实现中直接让代理类去实现
  49.         [_delegate invoke];
  50. }
  51. @end


  52. // DelegateA
  53. @interface DelegateA :NSObject <InvokerDelegate>
  54. + (id)delegateA;
  55. @end

  56. @implementation DelegateA
  57. + (id)delegateA
  58. {
  59.         return [[[self alloc] init] autorelease];
  60. }

  61. - (void)dealloc
  62. {
  63.         NSLog(@"%@ deallocated",[self className]);
  64.         [super dealloc];
  65. }
  66. - (void)invoke
  67. {
  68.         NSLog(@"%@ be invoked",[self className]);
  69. }
  70. @end


  71. // DelegateB
  72. @interface DelegateB :NSObject <InvokerDelegate>
  73. + (id)delegateB;
  74. @end

  75. @implementation DelegateB
  76. + (id)delegateB
  77. {
  78.         return [[[self alloc] init] autorelease];
  79. }

  80. - (void)dealloc
  81. {
  82.         NSLog(@"%@ deallocated",[self className]);
  83.         [super dealloc];
  84. }

  85. - (void)invoke
  86. {
  87.         NSLog(@"%@ be invoked",[self className]);
  88. }
  89. @end


  90. int main()
  91. {
  92.         NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];
  93.        
  94.         Invoker * invoker=[Invoker invokerWithDelegate:[DelegateA delegateA]];
  95.         [invoker invoke];
  96.        
  97.         // 设置不同代理,invoke方法做的事也不一样
  98.         // 只要对象遵守了指定协议,就能正常作为其代理
  99.         [invoker setDelegate:[DelegateB delegateB]];
  100.         [invoker invoke];
  101.        
  102.         [pool drain];
  103.         return 0;
  104. }
复制代码


protocol在代理模式中:
        1>利用id<protocol>来限制代理类须遵守某个协议
        1>protocol须遵守基协议,让编译器知道该id拥有基协议中的方法







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2