iOS设计模式解析(六)代理模式
- 代理模式:为其他对象创建一个代理以控制对这个对象的访问
- UML解释:客户端向Proxy发起一个Request()请求,Proxy对象会把这个Request转发给Proxy对象的RealSubject。RealSubject会实施操作间接满足Subject要求。举一个生活中的例子就比较好理解了——去饭店点餐,我们就是UML中的Subject(客户端)、Proxy就是饭店的服务员、RealSubject就是厨师。我们不能直接向厨师点餐,我们把点餐(Request())请求发送给服务员(Proxy)。Proxy(服务员)将菜单转发给厨师(RealSubject)。其实为你服务的还是厨师。
- 例如 :Button类有两个子类ButtonA、ButtonB,我们通过对Button提供一个抽象工厂方法来产生不同的button子类:
- 应用场景:
- 为位于不同地址空间或网络的对象提供本地代表 ——远程代理(不知道VPN代理是不是就是这么实现的)
- 根据要求创建重型的对象 ——虚拟代理
- 根据不同访问权限控制对原对象的访问 ——保护代理(例如VIP特权,代理会根据权限分流数据)
- Cocoa Touch中的代理模式:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.cityListArrary.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellID = @"cityListCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
}
//cell.selectionStyle = UITableViewCellSelectionStyleNone;
//cell.textLabel.text = _cityListArrary[indexPath.row];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.text = [[_cityListArrary objectAtIndex:indexPath.row] objectForKey:@"name"];
cell.textLabel.font = [UIFont systemFontOfSize:FontSizeScaleWith6Plus(VICE_TITLE_FONT_SIZE)];
cell.textLabel.textColor = UIColorFromRGB(0x999999);
return cell;
} //------------------------------------------------------------------------------------------
#pragma mark -Delegate
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self.distinguish isEqualToString:@"freeFarm"])
{
if ([self.delegate respondsToSelector:@selector(sendCountyName:andCountyId:)])
{
NSString * countyName = [[_cityListArrary objectAtIndex:indexPath.row] objectForKey:@"name"];
//NSString * cityName = [[_dataFirst objectAtIndex:indexPath.row] objectForKey:@"name"];
NSInteger county_id = [[[_cityListArrary objectAtIndex:indexPath.row] objectForKey:@"county_id"] intValue];
[self.delegate sendCountyName:countyName andCountyId:county_id];
[self.navigationController popViewControllerAnimated:YES];
} }
else
{
LVLandShowViewController *landShowViewController = [[LVLandShowViewController alloc]init];
[self.navigationController pushViewController:landShowViewController animated:NO];
} }ViewController
/** 我想大家对UITableView的代理一定太熟悉了,那我们就分析一下系统这种代理模式:其中UITableView就是委托人(Subject),因为UITableView具体要长成什么样子它自己并不知道。那么就要找一个代理人来为我服务告诉我所需要的所有材料(ViewController)。为什么ViewController可以是我的代理人,那是必须的,ViewController你有所有我想知道的数据你就要成为我的代理。但是ViewController想要成为我的代理人它必须要有一定资质(UITableViewDelegate、UITableViewDataSource)。一旦ViewController有了资质就可以成为我的代理了。最后就是代理人该以什么方式什么规则告诉我需要的数据。没错协议。因为委托人声明了协议,那我代理人就可以用协议中指定的规则来为委托人服务 */
- 总结:代理模式在Cocoa Touch中很常见一定要灵活运用。这里只是介绍了一个很基本的例子如果后期有更好的例子会补充。
iOS设计模式解析(六)代理模式的更多相关文章
- iOS书摘之Objective-C编程之道 iOS设计模式解析
来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...
- IOS设计模式之三:MVC模式
IOS设计模式之三:MVC模式 模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...
- 简介Python设计模式中的代理模式与模板方法模式编程
简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...
- java设计模式之Proxy(代理模式)
java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...
- Java设计模式之《代理模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...
- iOS设计模式 - (3)简单工厂模式
iOS设计模式 - (3)简单工厂模式 by Colin丶 转载请注明出处: http://blog.csdn.net/hitwhylz/article/ ...
- Java设计模式:Proxy(代理)模式
概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- JS 设计模式六 -- 代理模式
概念 为一个对象提供一个代用品或占位符,以便控制对它的访问. 当客户不方便直接访问一个对象的时候,需要提供一个替身对象来控制对这个对象的访问. 替身对象对请求做出一些处理之后, 再把请求转交给本体对象 ...
随机推荐
- pt-online-schema-change解读
[用途]在线改表 [注意风险]因为涉及到修改表的数据和结构,所以在使用前要小心测试并做好备份,工具默认不会改表,除非你添加了--execute参数 [工具简介] pt-osc模仿MySQL内部的改表方 ...
- LAMP的安装
一,LAMP的安装流程:mysql.apache.php或者apache.mysql.php.php放到最后的原因是,php在编译安装的时候是依赖于前2者的. 二,Mysql的安装: 1.下载mysq ...
- PHP学习笔记十一【数组】
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/h ...
- MVC中的错误过滤器无法拦截URL路径错误的解决办法
“/”应用程序中的服务器错误. 无法找到资源. 说明: HTTP 404.您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用.请检查以下 URL 并确保其拼写正确. 请求 ...
- GDAL显示线性shp文件
http://pan.baidu.com/s/1qWIDphU (工程文件在vs2008中编写) 1.使用到的技术 GDAL:读取矢量数据 GDI: 绘制矢量数据 2.详细解释 GDI绘图: ...
- windows 文件watch nodejs
本篇博客,主要是记录下最近一直纠结的gulp.watch方法,在工作中我们肯定都遇到过,新添加的文件没办法自动触发watch,下面我们就来看有什么办法处理 1.首先我们肯定是先百度一下 百度推荐的是g ...
- python操作redis-事务
#!/usr/bin/python #!coding: utf-8 import redis import sys if __name__=="__main__": try: co ...
- 正式学习React(一) 开始学习之前必读
为什么要加这个必读!因为webpack本身是基于node环境的, 里面会涉及很多路径问题,我们可能对paths怎么写!webpack又是怎么找到这些paths的很迷惑. 本文是我已经写完正式学习Rea ...
- 常用的wsdl地址
天气预报Web Service,数据来源于中国气象局 Endpoint Disco WSDL IP地址来源搜索Web Service(是目前最完整的IP地址数据) Endpoint Disco WSD ...
- Chapter 4. Button, Checkbutton, and Radiobutton Widgets 按钮,复选按钮,单选按钮
Chapter 4. Button, Checkbutton, and Radiobutton Widgets 按钮,复选按钮,单选按钮 几乎所有的Perl/Tk 应用使用按钮以这样或者那样的方式 ...