本文主要是介绍OC语言之Protocol基本使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
# Protocol基本概念
##1.protocol 基本概念
- Protocol翻译过来, 叫做”协议”
+在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现的
+protocol它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的
- Protocol的作用
+用来声明一些方法
+也就说, 一个Protocol是由一系列的方法声明组成的
---
##2.protocol 语法格式
- Protocol的定义
```
@protocol 协议名称
// 方法声明列表
@end
```
- 类遵守协议
+一个类可以遵守1个或多个协议
+任何类只要遵守了Protocol,就相当于拥有了Protocol的所有方法声明
```
@interface 类名 : 父类 <协议名称1, 协议名称2,…>
@end
```
- 示例
```
@protocol SportProtocol <NSObject>
- (void)playFootball;
- (void)playBasketball;
@end
#import "SportProtocol.h" // 导入协议
@interface Studnet :NSObject<SportProtocol> // 遵守协议
@end
@implementation Student
// 实现协议方法
- (void)playBasketball
{
NSLog(@"%s", __func__);
}
// 实现协议方法
- (void)playFootball
{
NSLog(@"%s", __func__);
}
@end
```
##3.protocol和继承区别
- 继承之后默认就有实现, 而protocol只有声明没有实现
- 相同类型的类可以使用继承, 但是不同类型的类只能使用protocol
- protocol可以用于存储方法的声明, 可以将多个类中共同的方法抽取出来, 以后让这些类遵守协议即可
---
# Protocol类型限制
##1.protocol类型限制
- 设定情景:
+某攻城狮A希望找一个会做饭、洗衣服的女生做女朋友,有国企工作的优先。
+满足条件的女生都可以向他发送消息
- 从题目中我们得到要求
+会做饭
+会洗衣服
+有份好工作
```
@protocol WifeCondition<NSObject>
- (void)cooking;
- (void)washing;
- (void)job;
@end
```
- 如何在代码中要求对象必须具备这些行为?
+数据类型<协议名称> 变量名
```
// 如果没有遵守协议则会报警告
id<WifeCondition> wife = [[Personalloc] init];
```
# 代理设计模式
##1.
- 什么是设计模式
+设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
- 什么是代理设计模式
+生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是洁丽雅毛巾的代理。这其实和我们OO中的代理模式是很相似的。
- 代理设计模式的场合:
+当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
+对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
+当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
---
##2.代理设计模式示例
- 婴儿吃饭睡觉
```
// 协议
#import <Foundation/Foundation.h>
@class Baby;
@protocol BabyProtocol <NSObject>
- (void)feedWithBaby:(Baby *)baby;
- (void)hypnosisWithBaby:(Baby *)baby;
@end
```
#import "BabyProtocol.h"
@interface Baby : NSObject
// 食量
@property (nonatomic, assign) int food;
// 睡意
@property (nonatomic, assign) intdrowsiness;
// 饿
- (void)hungry;
// 睡意
- (void)sleepy;
@property (nonatomic, strong)id<BabyProtocol> nanny;
@end
@implementation Baby
- (void)hungry
{
self.food -= 5;
NSLog(@"婴儿饿了");
// 通知保姆
if ([self.nanny respondsToSelector:@selector(feedWithBaby:)]) {
[self.nanny feedWithBaby:self];
}
}
- (void)sleepy
{
self.drowsiness += 5;
NSLog(@"婴儿困了");
// 通知保姆
if ([self.nanny respondsToSelector:@selector(hypnosisWithBaby:)]) {
[self.nanny hypnosisWithBaby:self];
}
}
@end
```
// 保姆
@interface Nanny : NSObject<BabyProtocol>
@end
@implementation Nanny
- (void)feedWithBaby:(Baby *)baby
{
baby.food += 10;
NSLog(@"给婴儿喂奶, 现在的食量是%i", baby.food);
}
- (void)hypnosisWithBaby:(Baby *)baby
{
baby.drowsiness += 10;
NSLog(@"哄婴儿睡觉, 现在的睡意是%i", baby.drowsiness);
}
@end
```
- 有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人
---
##3.代理设计模式练习
- 学生通过中介找房子的过程,学生不知道怎么找所以让代理帮忙找
# 代理设计模式
##1.
- 什么是设计模式
+设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
- 什么是代理设计模式
+生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是洁丽雅毛巾的代理。这其实和我们OO中的代理模式是很相似的。
- 代理设计模式的场合:
+当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
+对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
+当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
---
##2.代理设计模式示例
- 婴儿吃饭睡觉
```
// 协议
#import <Foundation/Foundation.h>
@class Baby;
@protocol BabyProtocol <NSObject>
- (void)feedWithBaby:(Baby *)baby;
- (void)hypnosisWithBaby:(Baby *)baby;
@end
```
#import "BabyProtocol.h"
@interface Baby : NSObject
// 食量
@property (nonatomic, assign) int food;
// 睡意
@property (nonatomic, assign) intdrowsiness;
// 饿
- (void)hungry;
// 睡意
- (void)sleepy;
@property (nonatomic, strong)id<BabyProtocol> nanny;
@end
@implementation Baby
- (void)hungry
{
self.food -= 5;
NSLog(@"婴儿饿了");
// 通知保姆
if ([self.nanny respondsToSelector:@selector(feedWithBaby:)]) {
[self.nanny feedWithBaby:self];
}
}
- (void)sleepy
{
self.drowsiness += 5;
NSLog(@"婴儿困了");
// 通知保姆
if ([self.nanny respondsToSelector:@selector(hypnosisWithBaby:)]) {
[self.nanny hypnosisWithBaby:self];
}
}
@end
```
// 保姆
@interface Nanny : NSObject<BabyProtocol>
@end
@implementation Nanny
- (void)feedWithBaby:(Baby *)baby
{
baby.food += 10;
NSLog(@"给婴儿喂奶, 现在的食量是%i", baby.food);
}
- (void)hypnosisWithBaby:(Baby *)baby
{
这篇关于OC语言之Protocol基本使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!