//
// 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 ;
}

最新文章

  1. MySQL中select * for update锁表的范围
  2. 你真的了解UIControl吗?
  3. [转]如何判断js中的数据类型
  4. Union函数
  5. noi 2718 移动路线
  6. css实现阴影效果(box-shadow)
  7. Etl之HiveSql调优(left join where的位置)
  8. 161013、java实现邮件群发带附件
  9. Makefile,如何传递宏定义DEBUG【转】
  10. mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口
  11. EcShop之路-Smarty
  12. Adobe Illustrator CS6 绿色简体中文版下载地址
  13. js上拉加载、下拉刷新的插件
  14. [Intel Edison开发板] 06、Edison开发在linux中烧写、配置、搭建开发环境
  15. aix 6.1系统怎么安装?这里有详细图文教程
  16. ioc初步理解(二) 简单实用autofac搭建mvc三层+automapper=》ioc(codeFirst)
  17. Java建造者模式
  18. nginx日志分析 GoAccess
  19. 【ZJOI2007】粒子运动
  20. GoldenGate 12.3微服务架构与传统架构的区别

热门文章

  1. JsTree中节点添加CheckBox 以及 单选的实现
  2. java内存组成
  3. 重启rsyncd
  4. Jmeter BeanShell PreProcessor使用笔记
  5. 782B The Meeting Place Cannot Be Changed(二分)
  6. Hashing - Hard Version
  7. Springboot源码分析
  8. Android第三方开源SwitchButton
  9. SQL to MongoDB Mapping Chart
  10. ace &amp; web ide &amp; web code editor