oc66--代理模式应用2
2024-09-30 18:21:58
//
// BabyProtocol.h #import <Foundation/Foundation.h>
@class Baby; @protocol BabyProtocol <NSObject>
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby; // 哄婴儿睡觉
- (void)hongBaby:(Baby *)baby;
@end
//
// Baby.h
// day17 #import <Foundation/Foundation.h>
#import "BabyProtocol.h" @class Nanny, Studnet; /*
什么是代理设计模式
心相印和超市
超市就是心相印的代理, 它可以帮助心相印卖纸巾
也就是说, 代理也帮助另外一个类做一些事情 代理设计模式的应用场景 3.当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象) , 代理就相当于助手一样。
婴儿无法自己吃东西, 也无法自己入睡, 所以可以让保姆帮忙处理. 只要让保姆成为婴儿的代理就可以帮婴儿喂它吃东西和哄他睡觉
*/
@interface Baby : NSObject // 饥饿程度
@property (nonatomic, assign) int hungry;
// 睡意
@property (nonatomic, assign) int sleep; // 吃东西
- (void)food;
// 困了
- (void)sleepy; // 让婴儿拥有一个保姆
//@property (nonatomic, strong) Nanny *nanny;
//@property (nonatomic, strong) Studnet *stu; // 如果使用id类型来接收保姆, 如果将来换保姆了, 婴儿类不用修改代码,id就是object,
@property (nonatomic, strong) id<BabyProtocol> nanny; @end
//
// Baby.m #import "Baby.h"
#import "Nanny.h" @implementation Baby - (void)food
{
self.hungry += ;
NSLog(@"要吃东西 %i", self.hungry);
// 通知保姆
if ([self.nanny respondsToSelector:@selector(feedFood:)]) { [self.nanny feedFood:self];
}
} - (void)sleepy
{
self.sleep += ;
NSLog(@"困了 %i", self.sleep); // 通知保姆
if ([self.nanny respondsToSelector:@selector(hongBaby:)]) { [self.nanny hongBaby:self];
}
}
@end
//
// Nanny.h #import <Foundation/Foundation.h>
#import "BabyProtocol.h"
@class Baby;
@interface Nanny : NSObject <BabyProtocol> /*
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby; // 哄婴儿睡觉
- (void)hongBaby:(Baby *)baby;
*/
@end
//
// Nanny.m #import "Nanny.h"
#import "Baby.h" @implementation Nanny - (void)feedFood:(Baby *)baby
{
baby.hungry -= ;
NSLog(@"喂婴儿吃东西 %i", baby.hungry);
} - (void)hongBaby:(Baby *)baby
{
baby.sleep += ;
NSLog(@"哄婴儿睡觉 %i", baby.sleep);
}
@end
//
// Studnet.h #import <Foundation/Foundation.h>
#import "BabyProtocol.h"
@class Baby; @interface Studnet : NSObject <BabyProtocol>
/*
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby; // 哄婴儿睡觉
- (void)hongBaby:(Baby *)baby;
*/
@end
//
// Studnet.m #import "Studnet.h"
#import "Baby.h" @implementation Studnet
- (void)feedFood:(Baby *)baby
{
baby.hungry -= ;
NSLog(@"喂婴儿吃东西 %i", baby.hungry);
} - (void)hongBaby:(Baby *)baby
{
baby.sleep += ;
NSLog(@"哄婴儿睡觉 %i", baby.sleep);
}
@end
//
// main.m
// 协议的应用场景2-代理设计模式 #import <Foundation/Foundation.h>
#import "Baby.h"
#import "Nanny.h"
#import "Studnet.h"
#import "Teacher.h"
#import "Dog.h" int main(int argc, const char * argv[]) {
// 1.创建婴儿
Baby *b = [Baby new];
// 2.创建保姆
Nanny *n = [Nanny new];
// 3.将保姆赋值给婴儿呢
b.nanny = n; // 4.换保姆
Studnet *stu = [Studnet new];
b.nanny = stu; // 5.再次换保姆
Teacher *tea = [Teacher new];
b.nanny = tea; Dog *d = [Dog new];
b.nanny = d; //4.婴儿发飙
[b food];
[b sleepy]; return ;
}
最新文章
- MySQL中select * for update锁表的范围
- 你真的了解UIControl吗?
- [转]如何判断js中的数据类型
- Union函数
- noi 2718 移动路线
- css实现阴影效果(box-shadow)
- Etl之HiveSql调优(left join where的位置)
- 161013、java实现邮件群发带附件
- Makefile,如何传递宏定义DEBUG【转】
- mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口
- EcShop之路-Smarty
- Adobe Illustrator CS6 绿色简体中文版下载地址
- js上拉加载、下拉刷新的插件
- [Intel Edison开发板] 06、Edison开发在linux中烧写、配置、搭建开发环境
- aix 6.1系统怎么安装?这里有详细图文教程
- ioc初步理解(二) 简单实用autofac搭建mvc三层+automapper=》ioc(codeFirst)
- Java建造者模式
- nginx日志分析 GoAccess
- 【ZJOI2007】粒子运动
- GoldenGate 12.3微服务架构与传统架构的区别