• 代理模式:为其他对象创建一个代理以控制对这个对象的访问  

      

  • 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设计模式解析(六)代理模式的更多相关文章

  1. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

  2. IOS设计模式之三:MVC模式

    IOS设计模式之三:MVC模式   模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...

  3. 简介Python设计模式中的代理模式与模板方法模式编程

    简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...

  4. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  5. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  6. iOS设计模式 - (3)简单工厂模式

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

  7. Java设计模式:Proxy(代理)模式

    概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...

  8. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  9. JS 设计模式六 -- 代理模式

    概念 为一个对象提供一个代用品或占位符,以便控制对它的访问. 当客户不方便直接访问一个对象的时候,需要提供一个替身对象来控制对这个对象的访问. 替身对象对请求做出一些处理之后, 再把请求转交给本体对象 ...

随机推荐

  1. 【快速选择算法与nth_element函数】【续UVA11300 】

    在白书中提到了一种O(n)级别的寻找中位数算法 就是我们今天要介绍的主角 快速选择算法 类似快排 选择一个比较元素 进行递归处理寻找第k大元素 假设最后比较元素到了i 以下描述是我写快排的常用字符 所 ...

  2. winform —— listview创建表及简单的增删改查

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. android onIntent 是什么东西

    在Android应用程序开发的时候,从一个Activity启动另一个Activity并传递一些数据到新的Activity上非常简单,但是当您需要让后台运行的Activity回到前台并传递一些数据可能就 ...

  4. 《JavaScript 闯关记》之变量和数据类型

    当程序需要将值保存起来以备将来使用时,便将其赋值给一个变量,值的类型称作数据类型. 变量 JavaScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据.换句话说,每个变量仅仅是 ...

  5. CSS基础要点概况

    1.CSS概述 1)css指层叠样式表 2)样式定义如何显示HTML元素 3)样式通常存储在样式表中 4)把样式添加到HTML4.0中,是为了解决内容与表现分离的问题 5)外部样式表可以极大提高工作效 ...

  6. JavaScript面向对象精要

    来自:淡忘~浅思. 链接:http://www.ido321.com/1585.html 和 http://www.ido321.com/1586.html 数据类型   在JavaScript中,数 ...

  7. Chrome和Firefox浏览器调试对比

    最近的项目中使用Extjs5, 其中主要的一个特点就是js文件的动态加载,之前使用Firefox浏览器对js文件进行调试,打断点时,只对当次调试有效,刷新之后,由于动态加载的js文件(文件名后面加了一 ...

  8. locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory

    安装好CentOS后,第一次进入系统使用locate命令,结果出现:locate: can not stat () `/var/lib/mlocate/mlocate.db': No such fil ...

  9. linux shell--算术运算

    求和: 方法一.使用命令替换法: #!/bin/bash read -p 'input number a...' numA read -p 'input number b...' numB #这里有两 ...

  10. MYSQL 的 6 个返回时间日期函数

    方法1. curdate(),curtime(),now() 方法2. utc_date(),utc_time(),utc_datetime(); 可以看到utc时间相比东西八区要小8小时 注意. 返 ...