【代理设计模式之一 Objective-C语言】

一、用面向对象模拟男孩子找女朋友

1.男孩子找女朋友

要求:

必须:

1)会洗衣服

2)会做饭

优先:

1)如果有份过万的月薪的工作

2.如果用面向对象来设计这个过程,需要有哪些类

1)男孩子类:

属性:

姓名,年龄,钱,女朋友

行为:谈恋爱

2)然后,是需要女孩子类吗,不是,因为什么样的东西可以成为男孩子的女朋友,是不是只要会洗衣服,会做饭,就可以了,如果有份月薪过万的工作,优先考虑,没说必须是女的吧,那狗呢,是不是如果狗会洗衣服,会做饭,也能当男孩子的女朋友啊,所以接下来要定义的,不是女孩子类,而是一个协议,只要遵守了这个协议,就可以成为男孩子的女朋友,这个协议里有两个方法,洗衣服方法,做饭方法,哪个类想当他的女朋友,是不是只要遵守这个协议,就可以了

3.定义1个协议,就叫女朋友协议吧

洗衣服

做饭

这时候,假如有个女孩子类,这个女孩子想当男孩子的女朋友,是不是只要去遵守这个协议,就可以了吧?

女孩子只要遵守了这个协议,那么女孩子就拥有了洗衣服,做饭的行为了吧

同样道理啊,如果有一个狗类,狗也想当这个男孩子的女朋友,怎么办,让狗遵守这个协议就可以了吧

是不是最好先来个协议啊

所以,我先来个协议

4.女朋友协议:GFProtocol

1)遵守这个协议的东西,注意啊,不是人,都可以当男孩子的女朋友

2)这个协议都有哪些方法呢:洗衣服、做饭,这两个是必须的,所以用@required修饰

@required

- (void)wash;//洗衣服的方法

- (void)cook;//做饭的方法

这两个方法务必要有

还有一个可选的方法:用@optional修饰

@optional

- (void)job;

这就是:女朋友协议,只要遵守这个协议的东西都可以作为男孩子的女朋友

二、现在我们来定义男孩子类:Boy类

1.在Boy.h文件中

#import <Foundation/Foundation.h>

@interace Boy:NSObject

//这个Boy呢,他有一些属性吧,一个是姓名,一个是年龄,一个是钱,一个是女朋友

//姓名

@property(nonatomic,strong)NSString *name;

//年龄

@property(nonatomic,assign)int age;

//这家伙有多少钱

@property(nonatomic,assign)int money;

//女朋友,第一,什么东西都可以当他的女朋友,前提是只要遵守什么协议,是不是GF协议就可以了,所以这个指针是什么类型的,id,万物都可以,任意的Objective-C对象是不是都可以,但是,要求这个对象怎么样,是不是遵守GF协议,怎么办,尖尖<协议名>,把这个协议引进来啊,#import “GFProtocol.h”,怎么写:

@property(nonatomic,strong)id< GFProtocol > girlFriend;

//要加星吗,不要,因为id在typedef的时候,已经有星了

//他有个方法,叫做:谈恋爱talkLove

- (void)talkLove;

2.在Boy.m文件中

#import “Boy.h”

@implementation Boy

//记住,谈恋爱怎么谈的,像下面这样谈的:

- (void)talkLove

{

NSLog(@“哈尼,我回来了。”);

//回来以后呢,做什么事情呢

//记住,让他的女朋友,他们谈恋爱嘛,回来之后,让他的女朋友给他洗个衣服,做个饭

//是不是,让他拥有的这个女朋友,_girlFriend,给他洗个衣服,[_girlFriend wash],再让他的女朋友给他做个饭,[_girlFriend cook]

[_girlFriend wash];

[_girlFriend cook];

//最后,再打印一句话

NSLog(@“哈尼,明天继续哦。么么哒!”);

}

三、我们来试一试啊,在main.m文件中

#import <Foundation/Foundation.h>

#import “Boy.h”

#import <limits.h>

int main(){

Boy *b1 = [Boy new];

//给他赋一些值吧

b1.name = @“李刚”;

b1.age = 22;

b1.money = INT32_MAX;//这个是一个宏,是我int的最大值,21亿

//重点来了,这个李刚是不是有一个女朋友啊,那问题来了,什么东西才能当李刚的女朋友,是不是只要遵守了GF协议,就可以当李刚的女朋友了

//那我来个类啊,我来个Girl类

1.在Girl.h文件中:

#import <Foundation/Foundation.h>

#import “GFProtocol.h”

@interface Girl : NSObject

@property(nonatomic,strong)NSString *name;

@end

2.在main.m文件中:

#import <Foundation/Foundation.h>

#import “Boy.h”

#import “Girl.h”

#import <limits.h>

int main() {

Boy *b1 = [Boy new];

b1.name = @“李刚”;

b1.age = 22;

b1.money = INT32_MAX;

Girl *fj = [Girl new];//来个Girl,例如:凤姐

fj.name = @“凤姐”;

//好了,现在凤姐说,李刚,李刚,我想当你的女朋友,李刚允许不,不允许,因为凤姐根本就不符合,李刚同学找女朋友的条件,凤姐还没有遵守GF协议呢,不信你试一下啊

b1.girlFriend = fj;

//编译一下啊,肯定报警告

//如果凤姐就是要当,老子就是要当你的女朋友,霸王硬上弓,那这个大家思考,会有什么问题

//这个时候,我运行一下,会有问题吗,不会,什么时候会出问题,谈恋爱的时候……

//你看这个时候啊,李刚同学回家谈恋爱了啊

[b1 talkLove];

//你看,李刚同学回家一谈恋爱,他崩了,不信你运行一下,这时候肯定崩了

//为什么会崩了,因为李刚同学贪恋爱的时候,他怎么谈的啊,是不是让他拥有的女朋友,去洗衣服、做饭啊,而这个时候,李刚同学的女朋友,是不是凤姐啊,凤姐会洗衣服、做饭吗,不会啊,所以一谈恋爱,就崩了啊

3.那凤姐说:李刚,我无论如何都要当你的女朋友,那怎么办,是不是凤姐只能去学习洗衣服、做饭啊

如何让Girl对象拥有洗衣服、做饭的行为呢

让这个Girl遵守GF协议就可以了吧

好了,凤姐为了李刚放弃一切啊

在Girl.h文件中

#import <Foundation/Foundation.h>

#import “GFProtocol.h”

@interface Girl : NSObject < GFProtocol >

@property(nonatomic,strong)NSString *name;

@end

好了,这个时候,Girl对象一旦遵守了这个协议,这个时候,Girl是不是拥有了这个行为了吧

好了,自己再去实现一下,在Girl.m文件中

#import “Girl.h”

@implementation Girl

- (void)wash

{

NSLog(@“亲爱的,衣服洗好了哦。”);

}

- (void)cook

{

NSLog(@“亲爱的,饭做好了哦。”);

}

@end

好了,大家思考一下,这个时候,凤姐能不能当李刚的女朋友了?可以了

编译运行一下,不报错了

输出:

哈尼,我回来了

亲爱的,衣服洗好了哦。

亲爱的,饭做好了哦。

哈尼,明天继续哦,么么哒

三、有个问题大家思考一下,为什么我们要求这个girlFriend必须要遵守GF协议呢

1.原因很简单,因为我们马上要调用这个girlFriend当中的协议方法

只有这个girlFriend遵守了这个GF协议,那个girlFriend里面是不是才有这个wash、cook方法啊

你不遵守那个GF协议的话,你里面一定有这个方法吗,就不一定了啊

四、比如,我再来个Pig类

1.在Pig.h文件中

#import <Foundation/Foundation.h>

@interface Pig:NSObject

@property(nonatomic,strong)NSString *name;

@end

2.在main.m文件中

#import <Foundation/Foundation.h>

#import “Pig.h”

int main(){

Pig *zhuZhu = [Pig new];

//这时候,这个猪猪能不能作为李刚的女朋友呢?

//不可以,比如

b1.girlFriend = zhuZhu ;

//这是不行的,一编译,就报大警告

//像刚才说的,就是霸王硬上弓,后果就是谈恋爱,要崩的

//因为谈恋爱的时候,李刚要让他的女朋友猪猪去洗衣服、做饭,而这个时候,猪猪洗不了衣服、做不了饭,谈不了恋爱,你不信,可以试一下啊

[b1 talkLove];

//走一遭,你看,跟猪猪谈恋爱的时候就崩了,因为猪猪没有洗衣服、做饭的行为

//还是那句话,如果猪猪就是相当李刚的女朋友呢

//那就要猪猪遵守GF协议

return 0;

}

在Pig.h文件中

#import <Foundation/Foundation.h>

#import “GFProtocol.h”

@interface Pig:NSObject < GFProtocol >

@property(nonatomic,strong)NSString *name;

@end

在Pig.m文件中

#import “Pig.h”

@implementation Pig

//猪猪就有洗衣服、做饭的方法了吧,好了,猪猪来实现一下

- (void)wash

{

NSLog(@“衣服被我洗好了”);

}

- (void)cook

{

NSLog(@“我的饭给你吃,不做了。”);

}

@end

五、李刚能不能自己当自己的女朋友

1.可以,让自己洗衣服、做饭就可以了吧

2.让自己遵守这个GFProtocol协议

3.在Boy.h文件中

#import <Foundation/Foundation.h>

#import “GFProtocol.h”

@interface Boy:NSObject < GFProtocol >

@property(nonatomic,strong)NSString *name;

@property(nonatomic,assign)int age;

@property(nonatomic,assign)int money;

@property(nonatomic,strong)id< GFProtocol > girlFriend;

- (void)talkLove;

@end

4.在Boy.m文件中

#import “Boy.h”

@implementation Boy

- (void)talkLove

{

NSLog(@“哈尼,我回来了”);

[_girlFriend wash];

[_girlFriend cook];

NSLog(@“哈尼,明天继续哦,么么哒”);

}

- (void)wash

{

NSLog(@“单身狗的悲哀”);

}

- (void)cook

{

NSLog(@“狗也要吃饭”);

}

@end

在main.m文件中

#import <Foundation/Foundation.h>

#import “Boy.h”

int main{

Boy *b1 = [Boy new];

b1.name = @“李刚”;

b1.age = 22;

b1.money = INT32_MAX;

b1.girlFriend = b1;

[b1.talkLove];

return 0 ;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值