代理设计模式(转)

委托(delegate)也叫代理是iOS开发中常用的设计模式。我们借助于protocol(参考博文:objective-c协议(protocol))可以很方便的实现这种设计模式。

什么是代理?

苹果的官方文档给了很清晰的解释:

Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object. The delegating object keeps a reference to the other object—the delegate—and at the appropriate time sends a message to it. The message informs the delegate of an event that the delegating object is about to handle or has just handled. The delegate may respond to the message by updating the appearance or state of itself or other objects in the application, and in some cases it can return a value that affects how an impending event is handled. The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.

意译一下就是:代理是一种简单而功能强大的设计模式,这种模式用于一个对象“代表”另外一个对象和程序中其他的对象进行交互。 主对象(这里指的是delegating object)中维护一个代理(delegate)的引用并且在合适的时候向这个代理发送消息。这个消息通知“代理”主对象即将处理或是已经处理完了某一个事件。这个代理可以通过更新自己或是其它对象的UI界面或是其它状态来响应主对象所发送过来的这个事件的消息。或是在某些情况下能返回一个值来影响其它即将发生的事件该如何来处理。代理的主要价值是它可以让你容易的定制各种对象的行为。注意这里的代理是个名词,它本身是一个对象,这个对象是专门代表被代理对象来和程序中其他对象打交道的。

Cocoa中的代理

Cocoa Touch框架里大量使用了代理这种设计模式,在每个UI控件类里面都声明了一个类型为id的delegate或是dataSource,查看Cocoa的头文件可以发现很多如下的属性:

@property(nonatomic, assign)id<UIActionSheetDelegate> delegate;   // weak reference

通常格式为@property(nonatomic, assign)id<protocol_name> delegate;  即这个代理要遵循某一个协议,也就是说只有遵循了这个协议的类对象才具备代理资格。这同时也要求了代理类必须在头文件中声明遵循这个protocol_name协议并实现其中的@required方法,@optional的方法是可选的。

以UIActionSheet为例,我们定义一个View,当点击这个View中的某一个按钮时触发UIActionSheet, 当用户对UIActionSheet完成了某一项操作,比如Destruct按钮被按下,或是cancel按钮被按下,UIActionSheet会发送消息给delegate,由delegate完成对用户操作的响应,比如打印一个字符串到屏幕上。图示说明如下:

首先,我们创建一个基于tab的工程,在FirstViewController.h中添加代码,使这个类遵循UIActionSheetDelegate协议:

[cpp] view plaincopy

  1. @interface FirstViewController : UIViewController <UIActionSheetDelegate>

在View中添加一个按钮用于触发这个ActionSheet,然后编写这个按钮的响应代码:

[cpp] view plaincopy

  1. - (IBAction)invokeActionSheet:(id)sender {
  2. UIActionSheet *actionSheet = [[UIActionSheet alloc]
  3. initWithTitle:@"Delegate Example"
  4. delegate:self // telling this class(ViewController) to implement UIActionSheetDelegate
  5. cancelButtonTitle:@"Cancel"
  6. destructiveButtonTitle:@"Destruct"
  7. otherButtonTitles:@"Button 1",@"Button 2",nil];
  8. [actionSheet showInView:self.tabBarController.view];
  9. [actionSheet release];
  10. }

注意,上面有一个很重要的设置就是参数中有个delegate:self,这个设置就是指明了UIActionSheet的代理为self, 也即FirstViewController。

然后在FirstViewController.m中实现UIActionSheetDelegate中的方法:

[cpp] view plaincopy

  1. #pragma mark --UIActionSheet delegate methods
  2. - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
  3. switch (buttonIndex) {
  4. case 0:
  5. self.myTextFromActionSheet.text = @"Action Destructed!";
  6. break;
  7. case 1:
  8. self.myTextFromActionSheet.text = @"Action Button 1 Clicked!";
  9. break;
  10. case 2:
  11. self.myTextFromActionSheet.text = @"Action Button 2 Clicked!";
  12. break;
  13. case 3:
  14. self.myTextFromActionSheet.text = @"Cancel Button Clicked!";
  15. break;
  16. default:
  17. break;
  18. }
  19. }

上面的几步我们完成了对Cocoa中UIActionSheet已有代理的运用。然而我们很多时候需要自己编写定制的代理,该如何实现呢?

自定义代理

我们要做的是,创建一个view,自定义一个代理实现更新这个view中的字符串。上面我们已经创建好了一个tab工程,借用里面的second view。我们拖一个按钮到上面命名为ChangeText,响应函数为- (IBAction)changeText:(id)sender;点击这个按钮进入一个modal view 名为ChangeTextView,我们在ChangeTextView中输入一个字符串并在退出这个view后把这个字符串更新到second view上面。如何实现modal view和second view之间的数据传递呢?那就是代理!谁的代理?ChangeTextView的代理!因为我们直接在ChangeTextView中输入数据,需要由代理把输入的字符串反馈到second view上面去。

1、创建一个新的类ChangeTextViewController,并创建相应的xib文件。

2、在ChangeTextViewController.h中声明一个协议ChangeTextViewDelegate:

[cpp] view plaincopy

  1. @protocol ChangeTextViewDelegate <NSObject>
  2. - (void) textEntered:(NSString*) text;
  3. @end

和UIActionSheet类似,在ChangeTextViewController中我们也需要添加一个代理的声明:

[cpp] view plaincopy

  1. @property (assign, nonatomic) id<ChangeTextViewDelegate> delegate;

3、我们还需要在ChangeTextViewController.xib中添加一个按钮save,当按下这个按钮会返回到second view中,并更新字符串。对save按钮的响应函数为:

[cpp] view plaincopy

  1. - (IBAction)saveButtonClicked:(id)sender {
  2. //Is anyone listening
  3. if([delegate respondsToSelector:@selector(textEntered:)])
  4. {
  5. //send the delegate function with the amount entered by the user
  6. [delegate textEntered:textEntered.text];
  7. }
  8. [self dismissModalViewControllerAnimated:YES];
  9. }

[delegate textEntered:textEntered.text];这句代码的含义就是ChangeTextViewController通知代理,textEntered这个事件发生了,对textEntered这个消息的实现,即如何响应这个textEntered的事件由代理来实现。在本例中,SecondViewController就是ChangeTextViewController对象的代理。所以,我们要对SecondViewController做相应的设置使其满足代理的条件。首先,在SecondViewController.h中声明遵循协议ChangeTextViewDelegate。然后编辑ChangeText按钮的响应函数- (IBAction)changeText:(id)sender;

[cpp] view plaincopy

  1. - (IBAction)changeText:(id)sender {
  2. ChangeTextViewController *CTViewController = [[ChangeTextViewController alloc] initWithNibName:@"ChangeTextViewController" bundle:nil];
  3. //Assign this class to the delegate of ChangeTextViewController,
  4. //remember to make thie ViewController confirm to protocol "ChangeTextViewDelegate"
  5. //which is delared in file ChangeTextViewController.h
  6. CTViewController.delegate = self;
  7. [self presentModalViewController:CTViewController animated:YES];
  8. }

注意,CTViewController.delegate = self;这句实现了SecondViewController成为ChangeTextViewController对象的代理。

原文出处:http://blog.csdn.net/lovefqing/article/details/8270111

代理设计模式(转)

时间: 2024-10-05 14:05:45

代理设计模式(转)的相关文章

代理设计模式

1. 什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 什么是代理设计模式 生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什

UI开发----target/action设计模式和代理设计模式以及手势识别器

//  Created By 郭仔  2015年04月16日21:50:33 眼睛有点痛,视力也在急速下降,心灵之窗,注意保护! ================================================ 耦合是衡量?一个程序写的好坏的标准之?一, 耦合是衡量模块与模块之间关联程度的指标 "?高内聚,低耦合"是?面向对象编程的核⼼心思想: ================ 设计模式思想很重要的 ================== target/action设计模

你真的了解iOS代理设计模式吗?

OS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. 代理:是一种通用的设计模式,iOS中对代理支持的很好,由代理对象.委托者.协议三部分组成. block:iOS4.0中引入的一种回调方法,可以将回调处理代码直接写在block代码块中,看起来逻辑清晰代码整齐. target action:通过将对象传递到另一个类中,在另一个类中将该对象当做target的方式,来调用该对象方法,从

开发进阶11_代理设计模式_键盘的简单处理

代理设计模式: 1.使用场合 -> A想让B帮忙做一些事情,就让B成为A的代理 ->A想通知一下B发生了某些事情,或者想传递一些数据给B,就让B成为A的代理 ->B想监听A所做的一些事情,就让B成为A的代理 2.使用步骤 ->定义一份协议 ->B要遵守协议,实现相应的方法 ->A中要定义一个代理属性,id<协议> delegate ->创建B对象,设置A的delegate属性为B对象 键盘的简单处理: TextField:keyborad type属性

Objectvie - c代理设计模式

代理(delegate) 也称为委托,事情发生后,自己不处理,让别人来处理. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 代理设计模式的角色: 1.抽象角色:声明真实对象和代理对象的共同接口:再这里是协议protocol 2.代理角色:代理对象角色内容含有对真是对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以 便在任何时刻都能代替真实对象,同时代理对象可以再执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 3.真实角色:代理角色所代表的

IOS之Objective-C学习 代理设计模式

鉴于Objective-C是不支持多继承的,所以需要用协议来代替实现其他类的方法,所以有了代理设计模式. 代理,又称委托,delegation. 代理模式可以让一个单继承的类实现父类以外其他类的方法.代理也可以用于传值. 我们先来说说原理,最后再看看是如何传值的. 如图选取Objective-C File并选择Protocol创建文件后在该协议文件中写入方法. myProtocol.h @protocol myDelegation <NSObject> -(void)method1; -(vo

2016.01.13 代理设计模式

这几天都在用代码的形式在完成滑动解锁的功能,今天讲到了代理设计模式. ?代理设计模式 首先,设计模式是什么:一种完成特定功能的方式. 类别Category:给已有的类添加方法. 代理Delegate:1.配置 2.两个对象之间传递数据A(B) B-->A(A完成B的方法,但是B要将结果回调给A) 所有的设计模式都有一个固定的规范,所以代理设计模式也不例外: UnlockModel(功能类): 1.写一套代理(协议) 代理的方法就是回调的方式 @property TextSettingDelega

Proxy Design Pattern 代理设计模式

代理设计模式,这个模式很多用于服务器客户端之类的,上网也经常使用代理之类的,想起来感觉是很复杂的,不过这个设计模式本身是很简单的. 就是一个类调用另外一个类的函数,客户调用的是一个类,而实际的工作是由另外一个类做的. 体现这个设计模式的代码: #include <stdio.h> class RealObj { public: virtual void handleReq() = 0; }; class DoSomething : public RealObj { public: void h

ios代理设计模式

代理设计模式的作用:     1.A对象监听B对象的一些行为,A成为B的代理     2.B对象想告诉A对象一些事情,A成为B的代理   代理设计模式的总结:     如果你想监听别人的一些行为,那么你就要成为别人的代理     如果你想告诉别人一些事情,那么就让别人成为你的代理         代理设计模式的开发步骤     1.拟一份协议(协议名字的格式:控件名 + Delegate),在协议里面声明一些代理方法(一般代理方法都是@optional)     2.声明一个代理属性:@prop