1、需求:实现人能够具备打印、传真、打电话的功能
2、分析:人通过工具完成上述功能,比如传真机
3、实现:人通过调用传真机的方法来完成所需要的功能
4、细节:
A> 分别创建人和传真机对象,对象进行组合,对象人拥有成员变量传真机;
B> 通过创建一个公共协议,如具备(打印、传真、打电话)功能的集合;
5、通过协议实现功能的好处在于,任何遵守协议的类创建的对象都能完成相关功能,可以避免固定某种类型对象做为成员变量,灵活性高,耦合性低;
6、通过调用其他类对象来完成自身需要完成的功能,自身不关心完成细节,只关心其他类对象的返回结果,并将返回结果做为自身方法的内容,这种行为叫代理;
用代码来说明问题:
Protocol.h- //
- // Protocol.h
- // protocol
- //
- // Created by yusian on 14-3-21.
- // Copyright (c) 2014年 小龙虾论坛. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- // 定义一个协议"Protocol",该协议包含三个方法call、print、fax
- @protocol Protocol <NSObject> // 该协议本身又遵守基协议"NSObject"
- // 方法声明,默认属性为@required,即必须实现的方法
- - (void)call;
- // optional属性为可选实现方法,主要在于程序员交流使用
- @optional
- - (void)print;
- // 必须实现的方法声明
- @required
- - (void)fax;
- @end
复制代码 SAFax.h- //
- // SAFax.h
- // protocol
- //
- // Created by yusian on 14-3-21.
- // Copyright (c) 2014年 小龙虾论坛. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Protocol.h"
- // 定义一个类,遵守"Protocol"协议,即在类实现中要实现协议中的相关方法
- @interface SAFax : NSObject <Protocol>
- @end
复制代码 SAFax.m- //
- // SAFax.m
- // protocol
- //
- // Created by yusian on 14-3-21.
- // Copyright (c) 2014年 小龙虾论坛. All rights reserved.
- //
- #import "SAFax.h"
- // 类方法实现除了要实现自身的方法外,还需要实现协议中的相关方法
- @implementation SAFax
- // 协议中的required属性方法
- - (void)fax
- {
- NSLog(@"Faxing...");
- }
- // 协议中默认的required属性方法
- - (void)call
- {
- NSLog(@"Calling...");
- }
- // 协议中optional属性方法,该方法不在类实现中实现也不会有警告,但另外两个方法没实现会有警告
- - (void)print
- {
- NSLog(@"Printing...");
- }
- @end
复制代码 Person.h- //
- // Person.h
- // protocol
- //
- // Created by yusian on 14-3-21.
- // Copyright (c) 2014年 小龙虾论坛. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Protocol.h"
- @interface Person : NSObject
- // 定义一个对象成员变量,该成员必须遵守"Protocol"协议,类型不定,只关心能够实现协议中的方法即可
- // 即不关心你具体是什么东西,只关心你能否实现我所需要的功能,传真机?一体机?电话机?打印机?随便!
- @property (nonatomic, strong) id<Protocol> printer;
- // 人需要具备发送传真的能力
- - (void)sendFax;
- // 人需要具备打印文件的能力
- - (void)printFile;
- // 人需要具备打电话的能力
- - (void)telephone;
- @end
复制代码 Person.m- //
- // Person.m
- // protocol
- //
- // Created by yusian on 14-3-21.
- // Copyright (c) 2014年 小龙虾论坛. All rights reserved.
- //
- #import "Person.h"
- @implementation Person
- - (void)sendFax
- {
- // 人通过调用打印机的传真功能来完成人发送传真的能力
- [_printer fax];
- }
- - (void)printFile
- {
- // 人通过调用打印机的打印功能来完成人打印文件的能力
- [_printer print];
- }
- - (void)telephone
- {
- // 人通过调用打印机的通话功能来完成人打电话的能力
- [_printer call];
- }
- @end
复制代码 SAPrint.h- //
- // SAPrint.h
- // protocol
- //
- // Created by yusian on 14-3-21.
- // Copyright (c) 2014年 小龙虾论坛. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Protocol.h"
- @interface SAPrint : NSObject <Protocol>
- @end
复制代码 SAPrint.m- //
- // SAPrint.m
- // protocol
- //
- // Created by yusian on 14-3-21.
- // Copyright (c) 2014年 小龙虾论坛. All rights reserved.
- //
- #import "SAPrint.h"
- @implementation SAPrint
- - (void)print
- {
- NSLog(@"Printing...");
- }
- - (void)fax
- {
- NSLog(@"Faxing...");
- }
- - (void)call
- {
- NSLog(@"Calling...");
- }
- @end
复制代码 main.m- //
- // main.m
- // protoco
- //
- // Created by yusian on 14-3-21.
- // Copyright (c) 2014年 小龙虾论坛. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Person.h"
- #import "SAFax.h"
- #import "SAPrint.h"
- int main()
- {
-
- // 创建一个对象人
- Person * p = [[Person alloc] init];
- /**************************************************/
-
- // 创建一个传真机对象
- SAFax * f = [[SAFax alloc] init];
-
- // 将该传真机做为人完成各种功能的代理工具,代理人所需要的"printer"所有功能
- p.printer = f;
-
- // 人体现打印文件的能力,即调用代理的打印功能
- [p printFile];
-
- // 人调用代理的传真的功能来体现人具备发送传真的能力
- [p sendFax];
-
- // 人调用代理的通话功能来体现人具备打电话的能力
- [p telephone];
-
- /**************************************************/
-
- // 创建一个打印机对象
- SAPrint * pr = [[SAPrint alloc] init];
-
- // 将该打印机做为人完成各种功能的工具,人并不关心完成功能的工具,只关心该工具是具备各项功能
- // 遵守协议的类创建出来的对象都具备协议声明的功能,都能够完成相关任务
- p.printer = pr;
-
- // 对象人在不进行任何修改的情况下,通过使用其他对象做为其成员变量完成同样的功能,灵活性大,耦合性低
- [p printFile];
- [p sendFax];
- [p telephone];
-
- return 0;
- }
复制代码 运行结果: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
代理是一种基本设计模式!
|