OC视频笔记5.4(协议的定义与使用)(代理设计模式)(代理设计模式思想)
2015-06-03 20:42
519 查看
参考:姜维的技术人生的csdn博文
http://blog.csdn.net/column/details/ios-enhance.html
参考了他的协议和代理两篇博文。
协议:
这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到。协议是定义了一组方法,让其他的类实现,协议本身不是类,但是与类相同的是协议的名字也是以大写字母开头。(OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的。
协议就是定义了一组方法,然后让其他类去实现)。
@required表示必须实现的方法
@optional表示可选实现的方法
(如果不标注就表示默认,默认是必须实现的)
协议的定义格式:
@protocol 协议名 <父协议>
定义方法
@end
注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的
<NSObject>是WxhlProtocol的父协议,它本身不是类,是协议,只是与NSObject类同名。他也是OC中第一个协议
类实现协议的表示方法:
@interface 类:NSObject<协议>
然后方法实现:
@required必须实现
@optional选择实现
在类的.h文件写上这句话:@interface 类:NSObject<协议名>就可以了,不需要将协议声明的方法挪到类的.h文件里面,然后直接在.m文件里面直接实现就可以了。如果直接将协议定义到类的.h文件里面的话就直接引用该类的.h文件就可以了。(定义在.h文件里面的方法是在#import <Foundation/Foundation.h>下面直接@protocol 代码@end就可以了)
小技巧:
1.在实现的时候可以用#pragma mark - WxhlProtocol方法将类划分。这样就可以将一个类中的方法类别分的更细,我们可以在文件导航栏中进行查看。
2.#warning 代码过几天在补充,标记处代码会有一个警告,Xcode会在此处显示***标记,这个作用就是给自己添加一个标记,后续在来查看。
总结
协议在OC中也是一个很重要的概念,Foundation框架中很多地方都用到了协议,其实和Java中的抽象类以及接口非常相似
代理设计模式:
什么是设计模式?设计模式(Design Pattern)描述了软件开发过程中,若干重复出现的问题得解决方案,目的是提高程序的可扩展性和维护性。
这里举一个简单的例子:
小孩类,护士类,保姆类,其中小孩类有两个方法:wash和play
这里代理对象就是:护士类、保姆类,小孩类是被代理对象。
看一下代码:
首先看一下小孩类:
Children.h
[objc]
view plaincopy
//
// Children.h
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
@class Children;//如果没有这行代码的话,协议ChildrenDelegate中得Children类型就会查找不到,报错
@protocol ChildrenDelegate <NSObject>
@required
- (void)wash:(Children *)children;
- (void)play:(Children *)children;
@end
@interface Children : NSObject{
//Nure *_nure;//保姆
//这里可以使用多态技术实现,因为保姆,护士有共同的父类NSObject,但是这里不使用这种方式,而是使用id类型
//但是我们还需要为这个类型添加一些方法,这里就用到了协议
//这个代理对象必须遵从ChildrenDelegate协议
id<ChildrenDelegate> _delegate;//这个变量就是小孩的代理对象
NSInteger timeValue;
}
-(void)setDelegate:(id)delegate;
@end
这里,我们定义了一个协议:ChildrenDelegate,他有两个必要的方法:wash和play
我们还定义了一个很重要的属性
_delegate
这个属性定义有点不一样,这个就是实现代理对象的精髓所在了,id是不确定类型,所以这个_delegate变量可以被赋值为的类型是:
只要实现了ChildrenDelegate协议的类就可以了。这里就记住了,以后这种定义方法后面会用到很多。相当于Java中的接口类型,只能赋值其实现类的类型。只是这里的定义格式为:id<协议名>
然后就是一个设置协议的方法了,注意参数类型也必须是id的
其实这里面也牵涉到了之前说到的多态特性,所以说代理模式也是建立在多态的特性上的。
Children.m
[objc]
view plaincopy
//
// Children.m
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "Children.h"
//这里用到了保姆的一些动作
//假如现在想请一个护士,那么我们又要去从新去请一个护士,那么这里面代码需要改,把保姆的地方换成护士的地方
//产生的原因就是因为耦合度太高了,保姆和孩子耦合在一起,如果需要换的话,就需要改动代码
//
@implementation Children
- (id)init{
self = [super init];
if(self != nil){
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
}
return self;
}
-(void)setDelegate:(id)delegate{
_delegate = delegate;
}
- (void)timerAction:(NSTimer *)timer{
timeValue++;
if(timeValue == 5){
[_delegate wash:self];
}
if(timeValue == 10){
[_delegate play:self];
}
}
@end
我们自定义了一个初始化方法,在初始化方法中我们做了一个定时器的工作。
[java]
view plaincopy
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
这个就是OC中启动一个简单的计时器:每隔1s中就去执行一次self中的timerAction方法。
OC中的定时器和java不一样,他的执行逻辑可以单独的在一个指定的方法中去做(C中的函数指针差不多,只要传递一个函数指针过来,就可以执行指定的函数,所以@selector做的工作就是这个),但是Java中必须实现Runable接口,在run方法中执行指定的逻辑代码。
在timerAction方法中,我们是判断当时间到5s了,就执行代理对象的wash方法,10s的时候执行play方法。
在来看一下护士类:
Nure.h
[objc]
view plaincopy
//
// Nure.h
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Children.h"
@interface Nure : NSObject<ChildrenDelegate>
- (void)wash:(Children *)children;
- (void)play:(Children *)children;
@end
护士类很简单,实现ChildrenDelegate协议
Nure.m
[objc]
view plaincopy
//
// Nure.m
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "Nure.h"
#import "Children.h"
@implementation Nure
- (void)wash:(Children *)children{
NSLog(@"小孩脏了,保姆帮小孩洗澡");
}
- (void)play:(Children *)children{
NSLog(@"小孩哭了,保姆和小孩玩耍");
}
@end
在这里就去实现wash和play方法了
在来看一下保姆类:
Nanny.h
[objc]
view plaincopy
//
// Nanny.h
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Children.h"
@interface Nanny : NSObject<ChildrenDelegate>
- (void)wash:(Children *)children;
- (void)play:(Children *)children;
@end
Nanny.m
[objc]
view plaincopy
//
// Nanny.m
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "Nanny.h"
#import "Children.h"
@implementation Nanny
- (void)wash:(Children *)children{
NSLog(@"小孩脏了,护士帮小孩洗澡");
}
- (void)play:(Children *)children{
NSLog(@"小孩哭了,护士和小孩玩耍");
}
@end
保姆类和护士类的代码逻辑是一样的,因为他们两个都是实现了一个协议
测试类
main.m
[objc]
view plaincopy
//
// main.m
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Children.h"
#import "Nure.h"
#import "Nanny.h"
//核心:id类型+协议
//做到低耦合操作
//同时也可以做到两个类之间的通信
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
Children *child = [[Children alloc] init];
Nure *nure = [[Nure alloc] init];
Nanny *nanny= [[Nanny alloc] init];
[child setDelegate:nanny];
// [child setNure:nure];
[[NSRunLoop currentRunLoop] run];
}
return 0;
}
看到了,测试类很简单。我们也发现了,代理模式的好处也是显现出来了,比如现在又来了一个人来照顾孩子:妈妈类,那么我们只要让妈妈类实现那个协议即可。这种耦合度也不会很高。所以代理模式还是超级有用的,而且我们后面在开发IOS的时候,会发现他里面用到的代理模式很多的。
运行结果:
总结
这一篇就介绍了OC中如何实现代理模式,其实OC中的代理模式核心技术是:id类型+协议+多态
代理协议的思想:
代理的概念:
当某个类的功能交个其他类去实现。那个实现的类就是代理。
代理模式使用场合:
1.用来解耦合。当一个类的功能需要其他类来实现,又不确定是由哪个类来实现,可以使用代理设计模式。
代理设计模式的实现:
1.定义成员变量为万能指针,并且该对象必须是继承某个协议。
总而言之,代理设计默认的基本思想----两个对象协同解决问题,通常运用于对象间通信。
代理设计模式的基本特点
简化了对象的行为,最大化减小对象之间的耦合度
使用代理,一般来说无需子类化
简化了我们应用程序的开发,既容易实现,而且灵活
http://blog.csdn.net/column/details/ios-enhance.html
参考了他的协议和代理两篇博文。
协议:
这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到。协议是定义了一组方法,让其他的类实现,协议本身不是类,但是与类相同的是协议的名字也是以大写字母开头。(OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的。
协议就是定义了一组方法,然后让其他类去实现)。
@required表示必须实现的方法
@optional表示可选实现的方法
(如果不标注就表示默认,默认是必须实现的)
协议的定义格式:
@protocol 协议名 <父协议>
定义方法
@end
注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的
<NSObject>是WxhlProtocol的父协议,它本身不是类,是协议,只是与NSObject类同名。他也是OC中第一个协议
类实现协议的表示方法:
@interface 类:NSObject<协议>
然后方法实现:
@required必须实现
@optional选择实现
在类的.h文件写上这句话:@interface 类:NSObject<协议名>就可以了,不需要将协议声明的方法挪到类的.h文件里面,然后直接在.m文件里面直接实现就可以了。如果直接将协议定义到类的.h文件里面的话就直接引用该类的.h文件就可以了。(定义在.h文件里面的方法是在#import <Foundation/Foundation.h>下面直接@protocol 代码@end就可以了)
小技巧:
1.在实现的时候可以用#pragma mark - WxhlProtocol方法将类划分。这样就可以将一个类中的方法类别分的更细,我们可以在文件导航栏中进行查看。
2.#warning 代码过几天在补充,标记处代码会有一个警告,Xcode会在此处显示***标记,这个作用就是给自己添加一个标记,后续在来查看。
总结
协议在OC中也是一个很重要的概念,Foundation框架中很多地方都用到了协议,其实和Java中的抽象类以及接口非常相似
代理设计模式:
什么是设计模式?设计模式(Design Pattern)描述了软件开发过程中,若干重复出现的问题得解决方案,目的是提高程序的可扩展性和维护性。
这里举一个简单的例子:
小孩类,护士类,保姆类,其中小孩类有两个方法:wash和play
这里代理对象就是:护士类、保姆类,小孩类是被代理对象。
看一下代码:
首先看一下小孩类:
Children.h
[objc]
view plaincopy
//
// Children.h
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
@class Children;//如果没有这行代码的话,协议ChildrenDelegate中得Children类型就会查找不到,报错
@protocol ChildrenDelegate <NSObject>
@required
- (void)wash:(Children *)children;
- (void)play:(Children *)children;
@end
@interface Children : NSObject{
//Nure *_nure;//保姆
//这里可以使用多态技术实现,因为保姆,护士有共同的父类NSObject,但是这里不使用这种方式,而是使用id类型
//但是我们还需要为这个类型添加一些方法,这里就用到了协议
//这个代理对象必须遵从ChildrenDelegate协议
id<ChildrenDelegate> _delegate;//这个变量就是小孩的代理对象
NSInteger timeValue;
}
-(void)setDelegate:(id)delegate;
@end
这里,我们定义了一个协议:ChildrenDelegate,他有两个必要的方法:wash和play
我们还定义了一个很重要的属性
_delegate
这个属性定义有点不一样,这个就是实现代理对象的精髓所在了,id是不确定类型,所以这个_delegate变量可以被赋值为的类型是:
只要实现了ChildrenDelegate协议的类就可以了。这里就记住了,以后这种定义方法后面会用到很多。相当于Java中的接口类型,只能赋值其实现类的类型。只是这里的定义格式为:id<协议名>
然后就是一个设置协议的方法了,注意参数类型也必须是id的
其实这里面也牵涉到了之前说到的多态特性,所以说代理模式也是建立在多态的特性上的。
Children.m
[objc]
view plaincopy
//
// Children.m
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "Children.h"
//这里用到了保姆的一些动作
//假如现在想请一个护士,那么我们又要去从新去请一个护士,那么这里面代码需要改,把保姆的地方换成护士的地方
//产生的原因就是因为耦合度太高了,保姆和孩子耦合在一起,如果需要换的话,就需要改动代码
//
@implementation Children
- (id)init{
self = [super init];
if(self != nil){
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
}
return self;
}
-(void)setDelegate:(id)delegate{
_delegate = delegate;
}
- (void)timerAction:(NSTimer *)timer{
timeValue++;
if(timeValue == 5){
[_delegate wash:self];
}
if(timeValue == 10){
[_delegate play:self];
}
}
@end
我们自定义了一个初始化方法,在初始化方法中我们做了一个定时器的工作。
[java]
view plaincopy
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
这个就是OC中启动一个简单的计时器:每隔1s中就去执行一次self中的timerAction方法。
OC中的定时器和java不一样,他的执行逻辑可以单独的在一个指定的方法中去做(C中的函数指针差不多,只要传递一个函数指针过来,就可以执行指定的函数,所以@selector做的工作就是这个),但是Java中必须实现Runable接口,在run方法中执行指定的逻辑代码。
在timerAction方法中,我们是判断当时间到5s了,就执行代理对象的wash方法,10s的时候执行play方法。
在来看一下护士类:
Nure.h
[objc]
view plaincopy
//
// Nure.h
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Children.h"
@interface Nure : NSObject<ChildrenDelegate>
- (void)wash:(Children *)children;
- (void)play:(Children *)children;
@end
护士类很简单,实现ChildrenDelegate协议
Nure.m
[objc]
view plaincopy
//
// Nure.m
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "Nure.h"
#import "Children.h"
@implementation Nure
- (void)wash:(Children *)children{
NSLog(@"小孩脏了,保姆帮小孩洗澡");
}
- (void)play:(Children *)children{
NSLog(@"小孩哭了,保姆和小孩玩耍");
}
@end
在这里就去实现wash和play方法了
在来看一下保姆类:
Nanny.h
[objc]
view plaincopy
//
// Nanny.h
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Children.h"
@interface Nanny : NSObject<ChildrenDelegate>
- (void)wash:(Children *)children;
- (void)play:(Children *)children;
@end
Nanny.m
[objc]
view plaincopy
//
// Nanny.m
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "Nanny.h"
#import "Children.h"
@implementation Nanny
- (void)wash:(Children *)children{
NSLog(@"小孩脏了,护士帮小孩洗澡");
}
- (void)play:(Children *)children{
NSLog(@"小孩哭了,护士和小孩玩耍");
}
@end
保姆类和护士类的代码逻辑是一样的,因为他们两个都是实现了一个协议
测试类
main.m
[objc]
view plaincopy
//
// main.m
// 12_DesignStyle
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Children.h"
#import "Nure.h"
#import "Nanny.h"
//核心:id类型+协议
//做到低耦合操作
//同时也可以做到两个类之间的通信
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
Children *child = [[Children alloc] init];
Nure *nure = [[Nure alloc] init];
Nanny *nanny= [[Nanny alloc] init];
[child setDelegate:nanny];
// [child setNure:nure];
[[NSRunLoop currentRunLoop] run];
}
return 0;
}
看到了,测试类很简单。我们也发现了,代理模式的好处也是显现出来了,比如现在又来了一个人来照顾孩子:妈妈类,那么我们只要让妈妈类实现那个协议即可。这种耦合度也不会很高。所以代理模式还是超级有用的,而且我们后面在开发IOS的时候,会发现他里面用到的代理模式很多的。
运行结果:
总结
这一篇就介绍了OC中如何实现代理模式,其实OC中的代理模式核心技术是:id类型+协议+多态
代理协议的思想:
代理的概念:
当某个类的功能交个其他类去实现。那个实现的类就是代理。
代理模式使用场合:
1.用来解耦合。当一个类的功能需要其他类来实现,又不确定是由哪个类来实现,可以使用代理设计模式。
代理设计模式的实现:
1.定义成员变量为万能指针,并且该对象必须是继承某个协议。
总而言之,代理设计默认的基本思想----两个对象协同解决问题,通常运用于对象间通信。
代理设计模式的基本特点
简化了对象的行为,最大化减小对象之间的耦合度
使用代理,一般来说无需子类化
简化了我们应用程序的开发,既容易实现,而且灵活
相关文章推荐
- 黑马程序员_Java_IO流(一)
- IntelliJ Idea 常用快捷键列表
- ReactJS读书笔记三:组件的组合和通信
- poj 3083
- javascript轮播技术
- 从头学习计算机之计算思维(第一讲 计算,计算机与计算思维)
- Unity3d_UGUI加载场景进度条
- tomcat-5.0.28在https模式下IE8无法下载文件问题解决
- [BZOJ3931]CQOI2015网络吞吐量|最短路|最大流
- 解决同一IP不同端口访问的站点iframe应用session丢失的问题
- POJ 2699 战斗小王子
- 设计模式(java) 单例模式 单例类
- 1的数目
- 激光雷达学习笔记(一)数据采集
- 一个轻量级C/C++日志库STLogFile.h
- Linux 下Scrapy的安装
- 推荐!国外程序员整理的 C++ 资源大全
- Pig 知识盲点
- 2015年百度之星程序设计大赛 - 资格赛:1002列变位法解密
- Android应用程序无法读写USB设备的解决方法