Sian 发表于 2014-3-21 18:24:00

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

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
{
    // 人通过调用打印机的传真功能来完成人发送传真的能力
    ;
}

- (void)printFile
{
    // 人通过调用打印机的打印功能来完成人打印文件的能力
    ;
}

- (void)telephone
{
    // 人通过调用打印机的通话功能来完成人打电话的能力
    ;
}

@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 = [ init];

/**************************************************/
   
    // 创建一个传真机对象
    SAFax * f = [ init];
   
    // 将该传真机做为人完成各种功能的代理工具,代理人所需要的"printer"所有功能
    p.printer = f;
   
    // 人体现打印文件的能力,即调用代理的打印功能
    ;
   
    // 人调用代理的传真的功能来体现人具备发送传真的能力
    ;
   
    // 人调用代理的通话功能来体现人具备打电话的能力
    ;
   
/**************************************************/
   
    // 创建一个打印机对象
    SAPrint * pr = [ init];
   
    // 将该打印机做为人完成各种功能的工具,人并不关心完成功能的工具,只关心该工具是具备各项功能
    // 遵守协议的类创建出来的对象都具备协议声明的功能,都能够完成相关任务
    p.printer = pr;
   
    // 对象人在不进行任何修改的情况下,通过使用其他对象做为其成员变量完成同样的功能,灵活性大,耦合性低
    ;
    ;
    ;
   
    return 0;
}
运行结果:2014-03-21 18:19:32.986 protocol Printing...2014-03-21 18:19:32.988 protocol Faxing...2014-03-21 18:19:32.988 protocol Calling...2014-03-21 18:19:32.988 protocol Printing...2014-03-21 18:19:32.988 protocol Faxing...2014-03-21 18:19:32.989 protocol Calling...Program ended with exit code: 0
代理是一种基本设计模式!
页: [1]
查看完整版本: 协议(Protocol)与代理设计模式