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

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

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

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

(在Objective-C2.0中能够在协议里选择是否必须实现某种方法,用[email protected]和@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,实际应用中会比这个复杂得多,可是希望通过我这个样例能让不了解的同学对托付设计模式有个初步的认识吧~

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

时间: 2024-10-11 20:47:07

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

Android cocos2dx游戏开发——示例程序HelloCpp源码分析

本文通过分析cocos2dx提供的示例程序HelloCpp来分析cocos2dx的启动过程. 我们从HelloCpp.java开始: [java] view plaincopyprint? package org.cocos2dx.hellocpp; import org.cocos2dx.lib.Cocos2dxActivity; import android.os.Bundle; public class HelloCpp extends Cocos2dxActivity{ protecte

[程序示例]Objective-C中的委托设计模式(牛仔与姑娘)

今天整理电脑翻到以前自学Objective-C时写的一个练习委托设计模式的一个小程序,就po上来和大家分享,顺便自己也复习一下OC中的委托. Objective-C中的委托设计模式是和协议分不开的. 协议呢,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现.(在Objective-C2.0中可以在协议里选择是否必须实现某种方法,用关键字@optional和@required) 委托的话,顾名思义就是自己处理不了的事情,委托他人按照协议里写好的条款来办理这件事. 具体实现

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

LTE用户文档 (如有不当的地方,欢迎指正!) 21 Examples Programs(示例程序) 路径 src/lte/examples/ 包含一些示例仿真程序,这些例子表明如何仿真不同的LTE场景. 22 Reference scenarios(参考场景) 文献中可以找到大量的参考仿真场景.下面我们列出了其中一部分: [TR36814] 的 A.2 节提到的系统仿真场景. dual stripe model [R4-092042], 在示例程序  src/lte/examples/lena

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

ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示如何在CentOS上运行.NET Core版本的MusicStore,并通过Jexus对外发布. 上篇文章 <结合Jexus + Kestrel 部署 asp.net core 生产环境> 我们已经部署好了.NET Core和Jexus,这篇文章主要演示如何运行.NET Core上的MusicSt

OSG中的示例程序简介

OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示了路径动画的使用(AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera.CameraView.MatrixTransform.PositionAttitudeTransform等四种类型的节点上.二)演示了osgSim::OverlayNode

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

部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0) 部署Bookinfo示例程序 在下载的Istio安装包的samples目录中包含了示例应用程序. Bookinfo应用 部署一个样例应用,它由四个单独的微服务构成,用来演示多种 Istio 特性.这个应用模仿在线书店的一个分类,显示一本书的信息.页面上会显示一本书的描述,书籍的细节(ISBN.页数等),以及关于这本书的一些评论. Bookinfo 应用分为四个单独的微服务: productpage

AT&amp;T x86_32 汇编_001_一个示例程序.md

这一节先写一个简单的汇编程序. 输出cpu的出产厂商. 不对语法, 寄存器等内容进行深入讨论, 只是整体上先有个认知印象. 1. 一些基础知识 简单来说, Linux下的可执行程序文件中, 最重要的三个部分是: 数据段, 代码段, bss段. 关于可执行文件, 以及目标文件的内容构成, 其实这是一个十分复杂的话题, 这里不进行深入讨论, 你可以简单的理解为: 可执行文件由段(section)组成. 每个可执行文件中存在多个段. 段是一种划分可执行二进制程序内容的手段 其中最重要的三个段: 数据段

winpcap示例程序采用VC6编译时出错error C2054: expected &#39;(&#39; to follow &#39;_W64&#39;

e:\vehiclesecurity\wpdpack_4_1_2\include\pcap-stdinc.h(80) : error C2054: expected '(' to follow '_W64' e:\vehiclesecurity\wpdpack_4_1_2\include\pcap-stdinc.h(80) : error C2085: 'uintptr_t' : not in formal parameter list e:\vehiclesecurity\wpdpack_4_

Windows Socket编程示例-TCP示例程序

前面一部分是介绍,后面有示例 1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问题,网络层的"ip地址"可以唯一标识网络中的主机,而传输层的"协议+端口"可以唯一标识主机中的应用程序(进程).这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互. 使用TCP