iOS 层层推进实现代理模式
1.代理模式核心思想:A类委托B类做某件事,然后A类获取B类的执行的返回结果!
举例:女孩想去买电影票,但是自己不亲自去而是委托男孩了解电影电影票信息,同时女孩获得男孩买票的结果,代码模拟实现:
/*********************************** Gril.h *************************************/
#import <Foundation/Foundation.h>
@class Boy;
@interface Gril : NSObject // “女孩”想去买电影票
- (void)buyTicket; // “女孩”声明自己的代理对象
@property (nonatomic,retain) Boy *boy;
// @property (nonatomic,retain) Boy *delegate; @end
/*********************************** Gril.m *************************************/
#import "Gril.h"
#import "Boy.h" @implementation Gril // “女孩”想买电影票
- (void)buyTicket
{
// “女孩”直接获取自己的代理(“男孩”)的方法返回值 剩余电影票的个数
int count = [_boy leftTicketsCount];
// “女孩”直接获取自己的代理(“男孩”)的方法返回值 单张电影票的价格
double price = [_boy ticketPrice]; // 输出女孩获得的信息
NSLog(@"还剩%d张电影票,每张票价是%.2f元",count,price); } // Girl类引用了Boy类 那么在Girl类释放之前先释放Boy对象
- (void)dealloc
{
[_boy release];
[super dealloc];
}
@end
/*********************************** Boy.h *************************************/
#import <Foundation/Foundation.h> @interface Boy : NSObject // 查询单张票价
- (double)ticketPrice;
// 查询还剩多少张电影票
- (int)leftTicketsCount; @end
/*********************************** Boy.m *************************************/
#import "Boy.h"
@implementation Boy // 实现单张票价的查询
- (double)ticketPrice
{
return ;
} // 实现剩余的电影票
- (int)leftTicketsCount
{
return ;
}
@end
/*********************************** main.m *************************************/
#import <Foundation/Foundation.h>
#import "Boy.h"
#import "Gril.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Gril *gril = [[[Gril alloc] init] autorelease];
Boy *boy = [[[Boy alloc] init] autorelease]; // 为girl中的boy属性赋值 完成"代理思想"
gril.boy = boy; // gril.delegate = boy; [gril buyTicket]; }
return ;
}
小结:可以看出Gril类的代理对象已固定是Boy类,这样的话代码耦合性太强,如果下次需要修改Gril类的代理对象为其他对象则不便于修改
修改后的代码如下:
/*********************************** Gril.h *************************************/
#import <Foundation/Foundation.h>
#import "TicketDelegate.h"
@class Boy; @interface Gril : NSObject // “女孩”想去买电影票
- (void)buyTicket; // “女孩”声明自己的代理对象为任意对象 但是对象必须遵守TicketDelegate协议
@property (nonatomic,retain) id<TicketDelegate> delegate; // 这样的话 任何对象都可以作为代理对象 只要遵守协议即可 @end
/*********************************** Gril.m *************************************/
#import "Gril.h"
#import "Boy.h" @implementation Gril // “女孩”想买电影票
- (void)buyTicket
{
// “女孩”直接获取自己的代理(“男孩”)的方法返回值 剩余电影票的个数
int count = [_delegate leftTicketsCount];
// “女孩”直接获取自己的代理(“男孩”)的方法返回值 单张电影票的价格
double price = [_delegate ticketPrice]; // 输出女孩获得的信息
NSLog(@"还剩%d张电影票,每张票价是%.2f元",count,price); } // Girl类引用了Boy类 那么在Girl类释放之前先释放Boy对象
- (void)dealloc
{
[_delegate release];
[super dealloc];
}
@end
// 定义协议
/***************************** TicketDelegate.h文件 ******************************/
#import <Foundation/Foundation.h> // 定义协议:那么代理对象必须要遵循协议 @protocol TicketDelegate <NSObject>
// 查询单张票价
- (double)ticketPrice;
// 查询还剩多少张电影票
- (int)leftTicketsCount;
@end
/*********************************** Boy.h *************************************/
#import <Foundation/Foundation.h>
#import "TicketDelegate.h" // 声明代理对象要遵守的协议
@protocol TicketDelegate; // Boy作为Gril的代理则必须遵守协议
@interface Boy : NSObject <TicketDelegate> @end
/*********************************** Boy.m *************************************/
#import "Boy.h"
@implementation Boy // 实现单张票价的查询
- (double)ticketPrice
{
return ;
} // 实现剩余的电影票
- (int)leftTicketsCount
{
return ;
}
@end
/*********************************** main.m *************************************/
#import <Foundation/Foundation.h>
#import "Boy.h"
#import "Gril.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Gril *gril = [[[Gril alloc] init] autorelease];
Boy *boy = [[[Boy alloc] init] autorelease]; // 为girl中的boy属性赋值 完成“代理思想”
gril.delegate = boy; // gril.delegate = boy; [gril buyTicket];
}
return ;
}
小结:修改后的代码耦合性相对来比较弱!假设如果再要为Gril类添加代理对象,Gril类本身不需要任何修改,只要新建的代理对象遵守协议即可
2.联想UITableView要显示内容时它本身并不知道要显示要分几组、每组显示多少行、每行显示的内容等,也是要依靠它的代理对象UITableViewDataSource来执行返回的结果会赋值给UITableView中的相应参数,才会进行显示
iOS 层层推进实现代理模式的更多相关文章
- Java设计模式:Proxy(代理)模式
概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...
- iOS开发-代理模式
代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...
- QF——iOS代理模式
iOS的代理模式: A要完成某个功能,它可以自己完成,但有时出于一些原因,不方便自己完成.这时A可以委托B来帮其完成此功能,即由B代理完成.但是这个功能不是让B随随便便任其完成.此时,会有一个协议文件 ...
- iOS代理模式(delegate)的使用
前言: 代理模式是iOS中非常重要的一个模式,iOS SDK中的系统控件几乎都用到了代理模式.代理模式用来处理事件监听.参数传递功能. 协议创建(Protocol): 可手打如下代码,或者在代码块里面 ...
- iOS的动态代理模式的实现
动态代理模式的应用很多,特别是在不能修改被代理类的前提下,要对执行某些方法时需要打log或者捕捉异常等处理时,是一个非常方便的方法.只需要少量修改客户端(场景类)代码和添加一个代理类就可以实现,这个符 ...
- iOS代理模式
iOS代理模式的简单理解:当一个对象无法直接获取到另一个对象的指针,又希望对那个变量进行一些操作时,可以使用代理模式. 代理主要由三部分组成: (1)协议:用来指定代理双方可以做什么,必须做什么. ( ...
- iOS重一些常用的代理模式
(一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和proto ...
- iOS:使用代理模式监听开关状态改变事件
记一次解决跨控制器监听开关状态改变的尝试. 为了统一设置UITableViewCell里的内容,自定义了UITableViewCell类的一个基类,命名为SettingCell.SettingCell ...
- iOS设计模式之代理模式
代理模式 基本理解 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 代理模式的应用 远程代理:就是为一个对象在不同的地址空间提供据不代表.这样可以隐藏一个对象存在于不同地址空间 ...
随机推荐
- git config(转载)
From:http://www.g2w.me/2013/10/cache-github-credential-for-https-repository/ http://openwares.net/li ...
- Java日期时间使用总结
一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在J ...
- codeblocks调试快捷键说明
使用codeblocks避免不了快捷键: 在调试程序的时候: 首先在view->toolbar->debugger调出来:快捷方式可以自己看 RUN to Cursor :F4 单步调试 ...
- [ActionScript 3.0] AS3.0 给flash事件传递参数的方法
有时我们想要给flash内置的事件(比如MouseEvent)传递参数,这时我们可以用到下面的方法. import flash.events.MouseEvent; mc.addEventListen ...
- java代码中后台向前台传递list或map集合案例
导入jar包 新建一个servert传递map集合 ajax.java代码: package servlet; import java.io.IOException; import java.io.P ...
- Delphi的内存管理及内存泄露问题 FastMM4
这几天因为一个程序长时间运行出现比较严重的内存泄露问题,开始关注了一下内存管理方面的东西,以前也注意内存管理,创建了对象及时释放,但总有忘了处理的情况. 在Delphi中没有自动回收机制,所以一定要及 ...
- centos7 下安装oracle 11g笔记
终于在vmare的centos7下将oracle11g安装成功了,不容易,将结果记录如下 启动oracle监听及服务的步骤,使用oracle用户登录,执行以下命令 登录到CentOS,切换到oracl ...
- 无法重新组织表 "ty_wf_ex_local_process_info" 的索引 "idx_prc_act_id" (分区 1),因为已禁用页级锁定。
无法重新组织表 "ty_wf_ex_local_process_info" 的索引 "idx_prc_act_id" (分区 1),因为已禁用页级锁定. ALT ...
- 页面设计--Label
页面设计功能是实现可视化的拖拉方式来设计业务单据页面,同时支持主从表单功能. 包含经常用到的控件:Label.TestBox.Button.ComboBox下拉框.CheckBox复选框.RadioB ...
- 排序(sort qsort)
qsort() 函数: sort() 函数表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所 ...