设计模式之代理
1.首先协议声明
|
1
2
3
4
5
6
|
@protocol myprotocol<NSObject>@required-(void)sum:(int)a param:(int)b;@optional-(void)add:(int)m param:(int)n;@end |
2.类实现协议
.h文件中
|
1
2
|
@interface Person : NSObject<myprotocol></myprotocol> |
.m文件中
|
1
2
3
4
|
-(void)sum:(int)a param:(int)b;{ NSLog(@"a+b=%d",a+b);} |
3.实现方法的调用
|
1
2
|
Person *p=[[Person alloc]init];[p sum:66 param:99]; |
上述代码声明了一个协议,并将Peoson类实现这个协议,此时改person类就有了改方法,可见person类的.h文件中并未声明 -(void)sum:(int)a param:(int)b;方法,在外部一样可以调用。
OC中的协议与C#的接口类似,都是为了实现多继承(oc、C#都是单继承,要实现多继承可用接口实现),只是OC中有@optional(可选)、@required(必须)之分,而C#中基类继承的接口就必须都要有实现。
4.代理的使用
代理设计模式运用面向接口的编程思想,体现了面向对象的多态的特征。
在OC中使用代理
(1)首先声明一个协议(接口)如上协议声明
(2)在类中声明一个协议类型的属性
|
1
|
@property(nonatomic,weak)id<myprotocol> myprotocoldelagate; |
(3)在类中通过协议类型的属性调用协议中的方法
|
1
|
[_myprotocoldelagate sum:m param:n]; |
(4)在实现协议的类中实现协议的方法
.h文件中声明实现协议
|
1
2
|
@interface son : NSObject<myprotocol>@end |
.m文件中实现协议方法
|
1
2
3
4
5
6
|
@implementation son-(void)sum:(int)a param:(int)b;{ NSLog(@"test%d",a+b);}@end |
(5)代理的使用
1.实例化声明协议为属性的类
2.实例化实现协议的类,并将其赋值给1实例化的协议类型的属性
3.调用1类协议属性的方法实现调用
详细代码如下:
preson类 新建myprotocol协议并将改协议做为类的一个属性 .h 文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#import <Foundation/Foundation.h>@protocol myprotocol<NSObject>@required-(void)sum:(int)a param:(int)b;@optional-(void)add:(int)m param:(int)n;@end@interface Person : NSObject@property(nonatomic,weak)id<myprotocol> myprotocoldelagate;-(void)fun:(int)m param:(int)n;@end |
.m文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#import "Person.h"@implementation Person/*-(void)sum:(int)a param:(int)b;{ NSLog(@"a+b=%d",a+b);}*/-(void)fun:(int)m param:(int)n{ [_myprotocoldelagate sum:m param:n];}@end |
实现协议的son类 .h文件
|
1
2
3
4
5
|
#import <foundation foundation.h="">@interface son : NSObject<myprotocol>@end</myprotocol></foundation> |
.m文件
|
1
2
3
4
5
6
7
|
#import "son.h"@implementation son-(void)sum:(int)a param:(int)b;{ NSLog(@"test%d",a+b);}@end |
在Main文件中
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#import <Foundation/Foundation.h>#import "Person.h"#import "son.h"int main(int argc, const char * argv[]) { @autoreleasepool { // Person *p=[[Person alloc]init];// [p sum:66 param:99]; son *son1=[[son alloc]init]; Person *p=[[Person alloc]init]; p.myprotocoldelagate=son1; // 多态思想 运行时多态 父类指针可以指向子类的对象 [p fun:55 param:88]; } return 0;} |

浙公网安备 33010602011771号