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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. //  TravelProtocol.h
  2. #import <Foundation/Foundation.h>

  3. @protocol TravelProtocol <NSObject>

  4. - (void)buyTicket;
  5. - (void)tanslate;
  6. - (void)exchangeMoney;
  7. - (void)hangout;

  8. @end
复制代码
  1. //  AmericaProtocol.h
  2. #import <Foundation/Foundation.h>
  3. #import "TravelProtocol.h"

  4. @protocol AmericaProtocol <TravelProtocol>
  5. //美国协议AmericaProtocol遵守旅游协议TravelProtocol
  6. @end
复制代码
  1. //  EuropeProtocol.h
  2. #import <Foundation/Foundation.h>
  3. #import "TravelProtocol.h"

  4. @protocol EuropeProtocol <TravelProtocol>
  5. //欧洲协议EuropeProtocol遵守旅游协议TravelProtocol
  6. @end
复制代码
  1. //  JapanProtocol.h
  2. #import <Foundation/Foundation.h>
  3. #import "TravelProtocol.h"

  4. @protocol JapanProtocol <TravelProtocol>
  5. //日本协议JapanProtocol遵守旅游协议TravelProtocol
  6. @end
复制代码
  1. //  AmericaTravleAgency.h
  2. #import <Foundation/Foundation.h>
  3. #import "AmericaProtocol.h"

  4. @interface AmericaTravelAgency : NSObject <AmericaProtocol>
  5. //美国代理AmericaTravelAgency遵守美国协议AmericaProtocol
  6. @end
复制代码
  1. //  AmericaTravleAgency.m
  2. #import "AmericaTravelAgency.h"

  3. @implementation AmericaTravelAgency

  4. - (void)buyTicket
  5. {
  6.     NSLog(@"美国代理买机票飞往美国");
  7. }
  8. - (void)tanslate
  9. {
  10.     NSLog(@"美国代理把当前语言翻译成美式英语");
  11. }
  12. - (void)exchangeMoney
  13. {
  14.     NSLog(@"美国代理把当前货币兑换成美元");
  15. }
  16. - (void)hangout
  17. {
  18.     NSLog(@"美国代理带路到拉斯维加斯赌场试试手气");
  19. }

  20. - (void)dealloc
  21. {
  22.     NSLog(@"美国代理被回收");
  23. }
  24. @end
复制代码
  1. //  EuropeTravelAgency.h
  2. #import <Foundation/Foundation.h>
  3. #import "EuropeProtocol.h"

  4. @interface EuropeTravelAgency : NSObject <EuropeProtocol>
  5. //欧洲代理EuropeTravelAgency遵守欧洲协议EuropeProtocol
  6. @end
复制代码
  1. //  EuropeTravelAgency.m
  2. #import "EuropeTravelAgency.h"

  3. @implementation EuropeTravelAgency

  4. - (void)buyTicket
  5. {
  6.     NSLog(@"欧洲代理买机票飞往欧洲");
  7. }
  8. - (void)tanslate
  9. {
  10.     NSLog(@"欧洲代理把当前语言翻译成欧洲语言");
  11. }
  12. - (void)exchangeMoney
  13. {
  14.     NSLog(@"欧洲代理把当前货币兑换成欧元");
  15. }
  16. - (void)hangout
  17. {
  18.     NSLog(@"欧洲代理带路参观德国保时捷工厂");
  19. }

  20. - (void)dealloc
  21. {
  22.     NSLog(@"欧洲代理被回收");
  23. }
  24. @end
复制代码
  1. //  JapanTravelAgency.h
  2. #import <Foundation/Foundation.h>
  3. #import "JapanProtocol.h"

  4. @interface JapanTravelAgency : NSObject <JapanProtocol>
  5. //日本代理JapanTravelAgency遵守日本协议JapanProtocol
  6. @end
复制代码
  1. //  JapanTravelAgency.m
  2. #import "JapanTravelAgency.h"

  3. @implementation JapanTravelAgency

  4. - (void)buyTicket
  5. {
  6.     NSLog(@"日本代理买机票飞往日本");
  7. }
  8. - (void)tanslate
  9. {
  10.     NSLog(@"日本代理把当前语言翻译成日语");
  11. }
  12. - (void)exchangeMoney
  13. {
  14.     NSLog(@"日本代理把当前货币兑换成日元");
  15. }
  16. - (void)hangout
  17. {
  18.     NSLog(@"日本代理带路到咖啡馆体验女仆服务");
  19. }

  20. - (void)dealloc
  21. {
  22.     NSLog(@"日本代理被回收");
  23. }

  24. @end
复制代码
  1. //  Tourist.h
  2. #import <Foundation/Foundation.h>
  3. #import "TravelProtocol.h"

  4. @interface Tourist : NSObject

  5. @property(nonatomic , strong) id<TravelProtocol> delegate; //要求代理属性必须是遵守TravelProtocol协议的对象
  6. + (id)tourist;

  7. //游客要做这些事
  8. - (void)buyTicket;
  9. - (void)tanslate;
  10. - (void)exchangeMoney;
  11. - (void)hangout;

  12. @end
复制代码
  1. //  Tourist.m
  2. #import "Tourist.h"

  3. @implementation Tourist

  4. + (id)tourist
  5. {
  6.     return [[Tourist alloc] init];
  7. }

  8. //这些事都交给代理去做,自己不亲自出马
  9. - (void)buyTicket
  10. {
  11.     [_delegate buyTicket];
  12. }

  13. - (void)tanslate
  14. {
  15.     [_delegate tanslate];
  16. }

  17. - (void)exchangeMoney
  18. {
  19.     [_delegate exchangeMoney];
  20. }

  21. - (void)hangout
  22. {
  23.     [_delegate hangout];
  24. }

  25. - (void)dealloc
  26. {
  27.     NSLog(@"游客代理被回收");
  28. }
  29. @end
复制代码
  1. //  main.m
  2. /*
  3. 代理设计模式:
  4. * 定义一个代理协议,声明各种动作
  5. * 声明一个代理类,必须遵守代理协议,并实现其中声明的动作
  6. * 声明主类,拥有一个代理属性,该属性必须遵守代理协议
  7. * 主类对象要进行的动作,都交给代理属性去执行

  8. 好处:
  9. * 不同的代理类可以差异化实现代理协议中声明的动作,例如:各国代理买机票的目的地不同,翻译的语言不同,兑换的货币不同,带路游览的目的地不同
  10. * 更改代理类代码时无需更改主类代码,只需限制代理属性的类型即可(即限制该属性必须遵守代理协议),例如:某天,美国代理良心发现,不带游客去赌场了,改去华尔街游览了,只需将自己的hangout方法实现改为去华尔街游览,Tourist类的hangout方法无需改变。
  11. */
  12. #import <Foundation/Foundation.h>
  13. #import "Tourist.h"
  14. #import "AmericaTravelAgency.h"
  15. #import "EuropeTravelAgency.h"
  16. #import "JapanTravelAgency.h"

  17. int main(int argc, const char * argv[])
  18. {
  19.     @autoreleasepool {
  20.         Tourist *t = [Tourist tourist];
  21.         AmericaTravelAgency *a = [[AmericaTravelAgency alloc] init];
  22.         EuropeTravelAgency *e = [[EuropeTravelAgency alloc] init];
  23.         JapanTravelAgency *j = [[JapanTravelAgency alloc] init];
  24.         
  25.         t.delegate = a;
  26.         NSLog(@"游客找了一个代理");
  27.         [t buyTicket];
  28.         [t tanslate];
  29.         [t exchangeMoney];
  30.         [t hangout];
  31.         
  32.         t.delegate = e;
  33.         NSLog(@"游客找了一个代理");
  34.         [t buyTicket];
  35.         [t tanslate];
  36.         [t exchangeMoney];
  37.         [t hangout];
  38.         
  39.         t.delegate = j;
  40.         NSLog(@"游客找了一个代理");
  41.         [t buyTicket];
  42.         [t tanslate];
  43.         [t exchangeMoney];
  44.         [t hangout];
  45.     }
  46.     return 0;
  47. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马