年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2731|回复: 0

协议(Protocol)与代理设计模式

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

    发表于 2014-3-21 18:24:00 | 显示全部楼层 |阅读模式
    1、需求:实现人能够具备打印、传真、打电话的功能
    2、分析:人通过工具完成上述功能,比如传真机
    3、实现:人通过调用传真机的方法来完成所需要的功能
    4、细节:
            A> 分别创建人和传真机对象,对象进行组合,对象人拥有成员变量传真机;
            B> 通过创建一个公共协议,如具备(打印、传真、打电话)功能的集合;
    5、通过协议实现功能的好处在于,任何遵守协议的类创建的对象都能完成相关功能,可以避免固定某种类型对象做为成员变量,灵活性高,耦合性低;
    6、通过调用其他类对象来完成自身需要完成的功能,自身不关心完成细节,只关心其他类对象的返回结果,并将返回结果做为自身方法的内容,这种行为叫代理;

    用代码来说明问题:

    Protocol.h
    1. //
    2. //  Protocol.h
    3. //  protocol
    4. //
    5. //  Created by yusian on 14-3-21.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. // 定义一个协议"Protocol",该协议包含三个方法call、print、fax
    10. @protocol Protocol <NSObject>  // 该协议本身又遵守基协议"NSObject"
    11. // 方法声明,默认属性为@required,即必须实现的方法
    12. - (void)call;
    13. // optional属性为可选实现方法,主要在于程序员交流使用
    14. @optional
    15. - (void)print;
    16. // 必须实现的方法声明
    17. @required
    18. - (void)fax;
    19. @end
    复制代码
    SAFax.h
    1. //
    2. //  SAFax.h
    3. //  protocol
    4. //
    5. //  Created by yusian on 14-3-21.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Protocol.h"
    10. // 定义一个类,遵守"Protocol"协议,即在类实现中要实现协议中的相关方法
    11. @interface SAFax : NSObject <Protocol>
    12. @end
    复制代码
    SAFax.m
    1. //
    2. //  SAFax.m
    3. //  protocol
    4. //
    5. //  Created by yusian on 14-3-21.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "SAFax.h"
    9. // 类方法实现除了要实现自身的方法外,还需要实现协议中的相关方法
    10. @implementation SAFax
    11. // 协议中的required属性方法
    12. - (void)fax
    13. {
    14.     NSLog(@"Faxing...");
    15. }
    16. // 协议中默认的required属性方法
    17. - (void)call
    18. {
    19.     NSLog(@"Calling...");
    20. }
    21. // 协议中optional属性方法,该方法不在类实现中实现也不会有警告,但另外两个方法没实现会有警告
    22. - (void)print
    23. {
    24.     NSLog(@"Printing...");
    25. }
    26. @end
    复制代码
    Person.h
    1. //
    2. //  Person.h
    3. //  protocol
    4. //
    5. //  Created by yusian on 14-3-21.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Protocol.h"
    10. @interface Person : NSObject
    11. // 定义一个对象成员变量,该成员必须遵守"Protocol"协议,类型不定,只关心能够实现协议中的方法即可
    12. // 即不关心你具体是什么东西,只关心你能否实现我所需要的功能,传真机?一体机?电话机?打印机?随便!
    13. @property (nonatomic, strong) id<Protocol> printer;
    14. // 人需要具备发送传真的能力
    15. - (void)sendFax;
    16. // 人需要具备打印文件的能力
    17. - (void)printFile;
    18. // 人需要具备打电话的能力
    19. - (void)telephone;
    20. @end
    复制代码
    Person.m
    1. //
    2. //  Person.m
    3. //  protocol
    4. //
    5. //  Created by yusian on 14-3-21.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "Person.h"
    9. @implementation Person
    10. - (void)sendFax
    11. {
    12.     // 人通过调用打印机的传真功能来完成人发送传真的能力
    13.     [_printer fax];
    14. }
    15. - (void)printFile
    16. {
    17.     // 人通过调用打印机的打印功能来完成人打印文件的能力
    18.     [_printer print];
    19. }
    20. - (void)telephone
    21. {
    22.     // 人通过调用打印机的通话功能来完成人打电话的能力
    23.     [_printer call];
    24. }
    25. @end
    复制代码
    SAPrint.h
    1. //
    2. //  SAPrint.h
    3. //  protocol
    4. //
    5. //  Created by yusian on 14-3-21.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Protocol.h"
    10. @interface SAPrint : NSObject <Protocol>
    11. @end
    复制代码
    SAPrint.m
    1. //
    2. //  SAPrint.m
    3. //  protocol
    4. //
    5. //  Created by yusian on 14-3-21.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "SAPrint.h"
    9. @implementation SAPrint
    10. - (void)print
    11. {
    12.     NSLog(@"Printing...");
    13. }
    14. - (void)fax
    15. {
    16.     NSLog(@"Faxing...");
    17. }
    18. - (void)call
    19. {
    20.     NSLog(@"Calling...");
    21. }
    22. @end
    复制代码
    main.m
    1. //
    2. //  main.m
    3. //  protoco
    4. //
    5. //  Created by yusian on 14-3-21.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Person.h"
    10. #import "SAFax.h"
    11. #import "SAPrint.h"
    12. int main()
    13. {
    14.    
    15.     // 创建一个对象人
    16.     Person * p = [[Person alloc] init];
    17. /**************************************************/
    18.    
    19.     // 创建一个传真机对象
    20.     SAFax * f = [[SAFax alloc] init];
    21.    
    22.     // 将该传真机做为人完成各种功能的代理工具,代理人所需要的"printer"所有功能
    23.     p.printer = f;
    24.    
    25.     // 人体现打印文件的能力,即调用代理的打印功能
    26.     [p printFile];
    27.    
    28.     // 人调用代理的传真的功能来体现人具备发送传真的能力
    29.     [p sendFax];
    30.    
    31.     // 人调用代理的通话功能来体现人具备打电话的能力
    32.     [p telephone];
    33.    
    34. /**************************************************/
    35.    
    36.     // 创建一个打印机对象
    37.     SAPrint * pr = [[SAPrint alloc] init];
    38.    
    39.     // 将该打印机做为人完成各种功能的工具,人并不关心完成功能的工具,只关心该工具是具备各项功能
    40.     // 遵守协议的类创建出来的对象都具备协议声明的功能,都能够完成相关任务
    41.     p.printer = pr;
    42.    
    43.     // 对象人在不进行任何修改的情况下,通过使用其他对象做为其成员变量完成同样的功能,灵活性大,耦合性低
    44.     [p printFile];
    45.     [p sendFax];
    46.     [p telephone];
    47.    
    48.     return 0;
    49. }
    复制代码
    运行结果:
    2014-03-21 18:19:32.986 protocol[3394:303] Printing...
    2014-03-21 18:19:32.988 protocol[3394:303] Faxing...
    2014-03-21 18:19:32.988 protocol[3394:303] Calling...
    2014-03-21 18:19:32.988 protocol[3394:303] Printing...
    2014-03-21 18:19:32.988 protocol[3394:303] Faxing...
    2014-03-21 18:19:32.989 protocol[3394:303] Calling...
    Program ended with exit code: 0

    代理是一种基本设计模式!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-5-5 22:27 , Processed in 0.043314 second(s), 19 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表