设计模式之代理
来源:互联网 发布:免费负载均衡软件 编辑:程序博客网 时间:2024/06/08 00:59
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;
}
0 0
- 设计模式之代理
- 设计模式 之 代理
- 设计模式之代理
- 设计模式之代理
- 设计模式之代理设计
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之-代理模式
- 设计模式之 代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- BZOJ 4813 [Cqoi2017]小Q的棋盘
- 关于游戏开发的片段
- 装完Centos7提示Initial setup of CentOS Linux 7 (core)
- 51nod 1090 3个数和为0(二分)
- Android 自定义Toast显示(不限时+在其他应用之上显示)
- 设计模式之代理
- [总结帖]关于升级xcode8,谈谈你的新发现!!!
- 产品:《人人都是产品经理》读书笔记
- Block Demo
- emacs的镜像网站
- 第九章 9-1 子窗口控件:按钮类
- CSS的margin塌陷(collapse)
- 博客汇总整理
- #10 D. LCIS (dp+最长公共上升子序列)