黑马程序员--OC学习笔记之代理模式的简单分析
来源:互联网 发布:东方财富软件打不开 编辑:程序博客网 时间:2024/05/01 14:20
代理模式概念
传入的对象,代替当前类完成了某个功能,称为代理模式。代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人, 即:婴儿和保姆之间有个协议,保姆继承该协议,于是保姆就需要实现该协议中的条款成为代理人。
利用协议实现代理模式的主要思路为():
1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现feedBaby与HongSleep方法
2)创建一个代理类(比如BaoMu),遵守上面的代理协议
3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量
4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值
下面看代码分析(一个经理不想自己去询问票价和剩余票数,于是找了一个助理,于是经理和助理之间商定了一个协议,协议中写明了助理需要做什么事情, 而助理就是这个代理人):
//首先声明一个助理需要遵守的一个协议
//声明一些跑腿的方法
TicketDelegate.h:
# import <Foundation/Foundation.h>
@protocol TicketDelegate <NSObject> //必须遵守基协议
//返回票价
- (double) ticketPrice;
//还剩多少张票
- (int) leftTicketNumber;
@end
//让代理类遵守协议 并且实现应该实现的方法,这样我们就有了 一个可以代理协议 跟一个代理,另外,我们可以通过协议 实现更多的代理 Agent.h:
# import <Foundation/Foundation.h>
@protocol TickProtocol; // 在代理头文件中声明有TickProtocol协议
@interface Person : NSObject <TicketDelegate>
@end
//方法的实现
Agent.m:
# import "Agent.h"
#import "TickProtocol.h"
@implementation Agent
//返回票价
- (double) ticketPrice
{
return 100;
}
//还剩多少张票
- (int) leftTicketNumber
{
return 66;
}
@end
//在person类中 _delegate这个变量代表着所使用的代理,要使用id类型, 但id类型必须要遵守协议才能使_delegate 能够使用协议中的方法
Person.h:
#import <Foundation/Foundation.h>
@class Agent; // 声明有Agent类
@protocol TickProtocol; // 声明有TickProtocol协议
@interface Person : NSObject
- (void)Buy; // 声明买票方法
@property (nonatomic,retain) id<TickProtocol> DeleAgent; // 声明一个代理,代理属性DeleAgent遵守协议
@end
//方法的实现
Person.m:
#import "Person.h"
#import "Agent.h"
#import "TickProtocol.h"
@implementation Person // 实现买票方法
- (void)Buy
{
int Price = [_DeleAgent PriceTick]; // 调用代理的方法买票
int LeftTick = [_DeleAgent LeftTick]; // 调用代理方法查看票的剩余数量
NSLog(@"price = %d,leftTick = %d",Price,LeftTick);
}
- (void) dealloc
{
[_delegate release];
[super dealloc];
}
@end
//编写main函数
main.m:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 创建人对象p
Person *p = [[Person alloc] init];
// 创建代理对象a
Agent *a = [[Agent alloc] init];
// 人的代理指向a
p.DeleAgent = a;
[p Buy];
}
return 0;
}
如果我们把代理删掉,Person还是在,Person可以另外找个代理2询问电影票的价格和剩余数,也就是说如果代理挂掉了也完全不 会影响到Person买电影票的情况。 有了代理后,Person不需要自己跑到电影院就可以买到票和票的剩余数了。Person也不关心Agent 是怎么得到票的价格和剩余数的,Person只想得到结果,并不想知道得到结果的过程。
总结:使用代理的最大好处就是类与类之间的耦合性降低了,我们可以针对Person或Agent增加另外的方法和成员变量,不需要考虑增加后是否对另外的类造成影响,增加了程序的弹性。
传入的对象,代替当前类完成了某个功能,称为代理模式。代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人, 即:婴儿和保姆之间有个协议,保姆继承该协议,于是保姆就需要实现该协议中的条款成为代理人。
利用协议实现代理模式的主要思路为():
1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现feedBaby与HongSleep方法
2)创建一个代理类(比如BaoMu),遵守上面的代理协议
3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量
4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值
下面看代码分析(一个经理不想自己去询问票价和剩余票数,于是找了一个助理,于是经理和助理之间商定了一个协议,协议中写明了助理需要做什么事情, 而助理就是这个代理人):
//首先声明一个助理需要遵守的一个协议
//声明一些跑腿的方法
TicketDelegate.h:
# import <Foundation/Foundation.h>
@protocol TicketDelegate <NSObject> //必须遵守基协议
//返回票价
- (double) ticketPrice;
//还剩多少张票
- (int) leftTicketNumber;
@end
//让代理类遵守协议 并且实现应该实现的方法,这样我们就有了 一个可以代理协议 跟一个代理,另外,我们可以通过协议 实现更多的代理 Agent.h:
# import <Foundation/Foundation.h>
@protocol TickProtocol; // 在代理头文件中声明有TickProtocol协议
@interface Person : NSObject <TicketDelegate>
@end
//方法的实现
Agent.m:
# import "Agent.h"
#import "TickProtocol.h"
@implementation Agent
//返回票价
- (double) ticketPrice
{
return 100;
}
//还剩多少张票
- (int) leftTicketNumber
{
return 66;
}
@end
//在person类中 _delegate这个变量代表着所使用的代理,要使用id类型, 但id类型必须要遵守协议才能使_delegate 能够使用协议中的方法
Person.h:
#import <Foundation/Foundation.h>
@class Agent; // 声明有Agent类
@protocol TickProtocol; // 声明有TickProtocol协议
@interface Person : NSObject
- (void)Buy; // 声明买票方法
@property (nonatomic,retain) id<TickProtocol> DeleAgent; // 声明一个代理,代理属性DeleAgent遵守协议
@end
//方法的实现
Person.m:
#import "Person.h"
#import "Agent.h"
#import "TickProtocol.h"
@implementation Person // 实现买票方法
- (void)Buy
{
int Price = [_DeleAgent PriceTick]; // 调用代理的方法买票
int LeftTick = [_DeleAgent LeftTick]; // 调用代理方法查看票的剩余数量
NSLog(@"price = %d,leftTick = %d",Price,LeftTick);
}
- (void) dealloc
{
[_delegate release];
[super dealloc];
}
@end
//编写main函数
main.m:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 创建人对象p
Person *p = [[Person alloc] init];
// 创建代理对象a
Agent *a = [[Agent alloc] init];
// 人的代理指向a
p.DeleAgent = a;
[p Buy];
}
return 0;
}
如果我们把代理删掉,Person还是在,Person可以另外找个代理2询问电影票的价格和剩余数,也就是说如果代理挂掉了也完全不 会影响到Person买电影票的情况。 有了代理后,Person不需要自己跑到电影院就可以买到票和票的剩余数了。Person也不关心Agent 是怎么得到票的价格和剩余数的,Person只想得到结果,并不想知道得到结果的过程。
总结:使用代理的最大好处就是类与类之间的耦合性降低了,我们可以针对Person或Agent增加另外的方法和成员变量,不需要考虑增加后是否对另外的类造成影响,增加了程序的弹性。
0 0
- 黑马程序员--OC学习笔记之代理模式的简单分析
- 黑马程序员---OC学习笔记之简单的单例模式实现
- 黑马程序员---OC学习笔记之利用协议实现代理模式
- 黑马程序员-OC学习笔记-----协议、代理
- 黑马程序员----OC学习笔记之NSArray
- 黑马程序员---OC学习笔记之block的基本概念
- 黑马程序员---OC学习笔记之block的使用场景
- 黑马程序员——OC语言之代理模式
- 黑马程序员_ 利用oc的协议实现代理模式
- [黑马程序员][OC]代理设计模式
- 黑马程序员---OC Prorocol代理模式
- 黑马程序员--OC学习笔记
- 黑马程序员----OC学习笔记之属性学习
- 黑马程序员----OC学习之单例模式
- 黑马程序员学习笔记——OC之基本简介
- 黑马程序员学习笔记-OC之foundation框架
- 黑马程序员----OC学习笔记之NSNumber和NSValue
- 黑马程序员-----oc语言学习笔记之block和协议
- PHP判断中文字符串的长度和字节长度
- 多态
- 北京国济中医院
- java.lang.OutOfMemoryError: PermGen space
- 一个处理用户登陆的servlet简单实例
- 黑马程序员--OC学习笔记之代理模式的简单分析
- oracle的for update
- PHP获取IP的方法对比
- ES6新特性概览
- 我用netbeans写了一个计算器 怎么实现连加功能 拜求大神
- JVM参数配置与性能调优
- Mysql MERGE引擎简介
- Android Studio中文乱码的解决
- Linux磁盘相关和MBR