博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之代理
阅读量:5208 次
发布时间:2019-06-14

本文共 2398 字,大约阅读时间需要 7 分钟。

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;
}

转载于:https://www.cnblogs.com/yulei126/p/6783259.html

你可能感兴趣的文章
哈希表1
查看>>
用Data Url (data:image/jpg;base64,)将小图片生成数据流形式
查看>>
实验2-2
查看>>
C#初识
查看>>
Spider-Python爬虫之聚焦爬虫与通用爬虫的区别
查看>>
String,StringBuffer与StringBuilder的区别?? .
查看>>
JavaScript(三) 数据类型
查看>>
移动端rem布局屏幕适配插件(放js中便可使用)
查看>>
Docker
查看>>
bzoj2259 [Oibh]新型计算机
查看>>
对位与字节的深度认识
查看>>
C++编程基础二 16-习题4
查看>>
MongoDB遇到的疑似数据丢失的问题。不要用InsertMany!
查看>>
服务器被疑似挖矿程序植入107.174.47.156,发现以及解决过程(建议所有使用sonatype/nexus3镜像的用户清查一下)...
查看>>
类型“XXX”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。
查看>>
JQuery 学习
查看>>
session token两种登陆方式
查看>>
C# ArrayList
查看>>
IntelliJ IDEA 12集成Tomcat 运行Web项目
查看>>
java,多线程实现
查看>>