今天整理电脑打开一次自我Objective-C当编写一个实践设计模式委托一个小程序,在po快来分享。也复习一下OC中的托付。

Objective-C中的托付设计模式是和协议分不开的。

协议呢。就是使用了这个协议后就要依照这个协议来办事,协议要求实现的方法就一定要实现。

(在Objective-C2.0中能够在协议里选择是否必须实现某种方法,用keyword@optional和@required)

托付的话,顾名思义就是自己处理不了的事情。托付他人依照协议里写好的条款来办理这件事。

详细实现的步骤能够依照以下这样:

1.拟定一份协议,协议里包含了想要实现的事情(即方法)。

2.托付人类中设置一个遵守该协议的托付变量。

3.被托付人类中实现协议要求的方法。

4.把托付人中的托付变量设置成被托付人。

5.当事情发生时。用托付变量调用被托付人中的协议方法。

以下讲讲我写的这个例程。牛仔与姑娘。

故事背景是,在联邦政府还没有进入的荒野西部。一个善良漂亮的姑娘Lucy和父亲相依为命,过着艰苦可是还算幸福的生活。一天,一群土匪强盗的到来带走了Lucy的父亲。Lucy伤心至极。便托付好心的牛仔John Marston去挽救他的父亲。并将这群恶棍绳之以法。正义驱使John接下了这个活,并终于挽救了Lucy的父亲,并惩治了坏蛋。

好了,首先我们得先创建一份协议Wanted。包括两个方法。saveHerDad和killTheBadGuy。代码例如以下:

#import <Foundation/Foundation.h>

@protocol Wanted <NSObject>
@required -(int)saveHerDad;
-(void)killTheBadGuy; @end

接着。创建姑娘Girl类,在当中设置一个遵守Wanted协议的托付变量。使用helpHelp方法来触发事件。我用了定时器来模拟整个事件的发生,接口例如以下:

#import <Foundation/Foundation.h>
#import "Wanted.h"
@interface Girl : NSObject
{
}
@property(nonatomic,copy) NSString *name;
@property(nonatomic,assign) id <Wanted> delegate; -(id)initWithName:(NSString*)name WithDelegate:(id<Wanted>) delegate;
-(void)helpHelp; @end

实现例如以下:

#import "Girl.h"
#import "Cowboy.h" @interface Girl () -(void)seesTheCowboy:(NSTimer *)timer; @end @implementation Girl -(id)initWithName:(NSString*)name WithDelegate:(id<Wanted>) delegate{
self = [super init];
if (self) {
self.name = name;
self.delegate = delegate;
}
return self;
} -(void)helpHelp{
NSLog(@"%@:My name is %@,my dad was taken by the bad guys,can you save him,please?",self.name,self.name);
NSLog(@"%@:OK,young lady,wait for the good news!",self.delegate);
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(seesTheCowboy:) userInfo:@"My dad" repeats:YES];
} -(void)seesTheCowboy:(NSTimer *)timer{
if ([self.delegate respondsToSelector:@selector(saveHerDad)]) {
int i = [self.delegate saveHerDad];
if (i==0) {
NSLog(@"%@:My heart is so broken,I cant live without him,you must save him please,woo woo.",self.name);
printf("\n");
}else{
NSLog(@"%@:Thank you so much,marry me~",self.name);
[timer invalidate];
}
}
} @end

然后,创建牛仔Cowboy类,用他来实现协议Wanted中的方法,因为不想让外部调用协议中的方法。所以我们将协议中的方法设置为私有方法。接口例如以下:

#import <Foundation/Foundation.h>

@interface Cowboy : NSObject

@property (nonatomic,copy) NSString *name;

@end

实现例如以下:

#import "Cowboy.h"

@implementation Cowboy
static int result;
-(int)saveHerDad{
printf("\n");
result = [self killTheBadGuy];
if (result == 0) {
NSLog(@"%@:There are too many of'em,I'll take all of my men and kill them all!!!Wait for the good news!",self.name);
result++;
return 0;
}else{
NSLog(@"%@ and his crew:I killed all the bad guys,and here is your father.",self.name);
return 1;
}
} -(int)killTheBadGuy{
return result;
}
-(NSString *)description {
NSString *name = self.name;
return name;
}
@end

好了,接下来我们就開始等着事件发生了,我设置了定时器,两秒触发一次,当result值为0的时候,营救并不成功。我们的牛仔铩羽而归;当result值为1时,营救任务成功,挽救了Lucy的父亲。

主函数登场:

#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Cowboy.h"
int main(int argc, const char * argv[])
{ @autoreleasepool {
Cowboy *cowboy = [[Cowboy alloc] init]; //创建Cowboy实例
cowboy.name = @"John Marston";
Girl *girl = [[Girl alloc] initWithName:@"Lucy" WithDelegate:cowboy]; //初始化girl,将cowboy作为托付人
[girl helpHelp]; //触发时间 NSDate *date = [NSDate date];
//设置定时器。程序共执行6秒
[[NSRunLoop currentRunLoop] runUntilDate:[date dateByAddingTimeInterval:6]];
}
return 0;
}

一切都准备就绪。如今让我们的牛仔拿起枪,行动起来吧。

编译成功!输出结果例如以下:

2014-07-16 17:27:10.973 Girl&Cowboy[4055:303] Lucy:My name is Lucy,my dad was taken by the bad guys,can you save him,please?

2014-07-16 17:27:11.012 Girl&Cowboy[4055:303] John Marston:OK,young lady,wait for the good news!

2014-07-16 17:27:13.014 Girl&Cowboy[4055:303] John Marston:There are too many of'em,I'll take all of my men and kill them all!!!Wait for the good news!

2014-07-16 17:27:13.015 Girl&Cowboy[4055:303] Lucy:My heart is so broken,I cant live without him,you must save him please,woo woo.

2014-07-16 17:27:15.014 Girl&Cowboy[4055:303] John Marston and his crew:I killed all the bad guys,and here is your father.

2014-07-16 17:27:15.015 Girl&Cowboy[4055:303] Lucy:Thank you so much,marry me~

Program ended with exit code: 0

我们的英雄把姑娘的父亲救出来了而且杀死了坏人。

这个样例非常easy,实际应用中会比这个复杂得多,可是希望通过我这个样例能让不了解的同学对托付设计模式有个初步的认识吧~

版权声明:本文博主原创文章,博客,未经同意不得转载。

[演示示例程序]Objective-C受委托的设计模式(牛仔女孩)的更多相关文章

  1. nginx subrequest演示示例程序

    只有简单subrequest应用演示示例. nginx.conf文件: #user nobody; worker_processes 1; #error_log logs/error.log; #er ...

  2. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

    ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...

  3. osg 示例程序解析之osgdelaunay

    osg 示例程序解析之osgdelaunay 转自:http://lzchenheng.blog.163.com/blog/static/838335362010821103038928/ 本示例程序 ...

  4. OSG中的示例程序简介

    OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...

  5. LTE Module User Documentation(翻译15)——示例程序、参考场景以及故障检测和调试技巧

    LTE用户文档 (如有不当的地方,欢迎指正!)     21 Examples Programs(示例程序)   路径 src/lte/examples/ 包含一些示例仿真程序,这些例子表明如何仿真不 ...

  6. OSG中的示例程序简介(转)

    OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...

  7. java 添加一个线程、创建响应的用户界面 。 演示示例代码

    javajava 添加一个线程.创建响应的用户界面 . 演示示例代码 来自thinking in java 4 21章  部分的代码  夹21.2.11 thinking in java 4免费下载: ...

  8. VS2012下基于Glut 矩阵变换示例程序2:

    在VS2012下基于Glut 矩阵变换示例程序:中我们在绘制甜圈或者圆柱时使用矩阵对相应的坐标进行变换后自己绘制甜圈或者圆柱.我们也可以使用glLoadMatrixf.glLoadMatrixd载入变 ...

  9. 部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0)

    部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0) 部署Bookinfo示例程序   在下载的Istio安装包的samples目录中包含了示例应用程序. ...

随机推荐

  1. 【高德地图API】从零開始学高德JS API(五)路线规划——驾车|公交|步行

    先来看两个问题:路线规划与导航有什么差别?步行导航与驾车导航有什么差别? 回答: 1.路线规划,指的是为用户提供3条路线推荐.[高德]在提供路线规划的时候,会提供用户自己定义路线规划功能,这是别家没有 ...

  2. 从零开始使用git第二篇:git的日常操作

    从零开始使用git 第二篇:git的日常操作 第一篇:从零开始使用git第一篇:下载安装配置 第二篇:从零开始使用git第二篇:git实践操作 第三篇:从零开始使用git第三篇:git撤销操作.分支操 ...

  3. 云服务器搭建 Nginx 静态网站

    第一步:安装 Nginx 在 CentOS 上,可直接使用 yum 来安装 Nginx(当然也可以通过下载压缩包.解压.编译的方式安装,不过太麻烦了) yum install nginx -y 第二步 ...

  4. 27、从零写UVC驱动之分析数据传输(设置ubuntu通过串口打印,指定打印到文件,ubuntu切换root用户)

    A. 设置ubuntu让它从串口0输出printk信息a. 设置vmware添加serial port, 使用文件作为串口(在vmware中设置,文件是保存在windows中)b. 启动ubuntu, ...

  5. C語言 rand函数 进阶探讨与实现

    C语言中随机函数应用        可能大家都知道C语言中的随机函数random,但是random函数并非ANSI C标准,所以说.random函数不能在gcc,vc等编译器下编译通过. 那么怎么实现 ...

  6. centos 查询DNS

    cat  /etc/resolv.conf

  7. 【50.26%】【hdu 5907】Find Q

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others) 问题描述 Byteasar迷恋上了 ...

  8. 修改Linux中的用户名 分类: B3_LINUX 2014-07-24 11:40 440人阅读 评论(0) 收藏

    需要修改2个文件: /etc/hosts /etc/sysconfig/network 然后重启 1.修改/etc/sysconfig/network NETWORKING=yes HOSTNAME= ...

  9. Android.app.SuperNotCalledException错误

    - ::): FATAL EXCEPTION: main - ::): android.app.SuperNotCalledException: Activity {com.solar/com.sol ...

  10. 后台返回的HTML整个页面代码打开方法

    后台返回的html代码片段,需要插入html标签中,而返回的整个html文档,则需要重写整个页面. 解决方法: 需要一个中转页面,用document.write()方法重写整个页面: // POST任 ...