1. //
  2. // BabyProtocol.h
  3.  
  4. #import <Foundation/Foundation.h>
  5. @class Baby;
  6.  
  7. @protocol BabyProtocol <NSObject>
  8. // 喂婴儿吃东西
  9. - (void)feedFood:(Baby *)baby;
  10.  
  11. // 哄婴儿睡觉
  12. - (void)hongBaby:(Baby *)baby;
  13. @end
  1. //
  2. // Baby.h
  3. // day17
  4.  
  5. #import <Foundation/Foundation.h>
  6. #import "BabyProtocol.h"
  7.  
  8. @class Nanny, Studnet;
  9.  
  10. /*
  11. 什么是代理设计模式
  12. 心相印和超市
  13. 超市就是心相印的代理, 它可以帮助心相印卖纸巾
  14. 也就是说, 代理也帮助另外一个类做一些事情
  15.  
  16. 代理设计模式的应用场景
  17.  
  18. 3.当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象) , 代理就相当于助手一样。
  19. 婴儿无法自己吃东西, 也无法自己入睡, 所以可以让保姆帮忙处理. 只要让保姆成为婴儿的代理就可以帮婴儿喂它吃东西和哄他睡觉
  20. */
  21. @interface Baby : NSObject
  22.  
  23. // 饥饿程度
  24. @property (nonatomic, assign) int hungry;
  25. // 睡意
  26. @property (nonatomic, assign) int sleep;
  27.  
  28. // 吃东西
  29. - (void)food;
  30. // 困了
  31. - (void)sleepy;
  32.  
  33. // 让婴儿拥有一个保姆
  34. //@property (nonatomic, strong) Nanny *nanny;
  35. //@property (nonatomic, strong) Studnet *stu;
  36.  
  37. // 如果使用id类型来接收保姆, 如果将来换保姆了, 婴儿类不用修改代码,id就是object,
  38. @property (nonatomic, strong) id<BabyProtocol> nanny;
  39.  
  40. @end
  1. //
  2. // Baby.m
  3.  
  4. #import "Baby.h"
  5. #import "Nanny.h"
  6.  
  7. @implementation Baby
  8.  
  9. - (void)food
  10. {
  11. self.hungry += ;
  12. NSLog(@"要吃东西 %i", self.hungry);
  13. // 通知保姆
  14. if ([self.nanny respondsToSelector:@selector(feedFood:)]) {
  15.  
  16. [self.nanny feedFood:self];
  17. }
  18. }
  19.  
  20. - (void)sleepy
  21. {
  22. self.sleep += ;
  23. NSLog(@"困了 %i", self.sleep);
  24.  
  25. // 通知保姆
  26. if ([self.nanny respondsToSelector:@selector(hongBaby:)]) {
  27.  
  28. [self.nanny hongBaby:self];
  29. }
  30. }
  31. @end
  1. //
  2. // Nanny.h
  3.  
  4. #import <Foundation/Foundation.h>
  5. #import "BabyProtocol.h"
  6. @class Baby;
  7. @interface Nanny : NSObject <BabyProtocol>
  8.  
  9. /*
  10. // 喂婴儿吃东西
  11. - (void)feedFood:(Baby *)baby;
  12.  
  13. // 哄婴儿睡觉
  14. - (void)hongBaby:(Baby *)baby;
  15. */
  16. @end
  1. //
  2. // Nanny.m
  3.  
  4. #import "Nanny.h"
  5. #import "Baby.h"
  6.  
  7. @implementation Nanny
  8.  
  9. - (void)feedFood:(Baby *)baby
  10. {
  11. baby.hungry -= ;
  12. NSLog(@"喂婴儿吃东西 %i", baby.hungry);
  13. }
  14.  
  15. - (void)hongBaby:(Baby *)baby
  16. {
  17. baby.sleep += ;
  18. NSLog(@"哄婴儿睡觉 %i", baby.sleep);
  19. }
  20. @end
  1. //
  2. // Studnet.h
  3.  
  4. #import <Foundation/Foundation.h>
  5. #import "BabyProtocol.h"
  6. @class Baby;
  7.  
  8. @interface Studnet : NSObject <BabyProtocol>
  9. /*
  10. // 喂婴儿吃东西
  11. - (void)feedFood:(Baby *)baby;
  12.  
  13. // 哄婴儿睡觉
  14. - (void)hongBaby:(Baby *)baby;
  15. */
  16. @end
  1. //
  2. // Studnet.m
  3.  
  4. #import "Studnet.h"
  5. #import "Baby.h"
  6.  
  7. @implementation Studnet
  8. - (void)feedFood:(Baby *)baby
  9. {
  10. baby.hungry -= ;
  11. NSLog(@"喂婴儿吃东西 %i", baby.hungry);
  12. }
  13.  
  14. - (void)hongBaby:(Baby *)baby
  15. {
  16. baby.sleep += ;
  17. NSLog(@"哄婴儿睡觉 %i", baby.sleep);
  18. }
  19. @end
  1. //
  2. // main.m
  3. // 协议的应用场景2-代理设计模式
  4.  
  5. #import <Foundation/Foundation.h>
  6. #import "Baby.h"
  7. #import "Nanny.h"
  8. #import "Studnet.h"
  9. #import "Teacher.h"
  10. #import "Dog.h"
  11.  
  12. int main(int argc, const char * argv[]) {
  13. // 1.创建婴儿
  14. Baby *b = [Baby new];
  15. // 2.创建保姆
  16. Nanny *n = [Nanny new];
  17. // 3.将保姆赋值给婴儿呢
  18. b.nanny = n;
  19.  
  20. // 4.换保姆
  21. Studnet *stu = [Studnet new];
  22. b.nanny = stu;
  23.  
  24. // 5.再次换保姆
  25. Teacher *tea = [Teacher new];
  26. b.nanny = tea;
  27.  
  28. Dog *d = [Dog new];
  29. b.nanny = d;
  30.  
  31. //4.婴儿发飙
  32. [b food];
  33. [b sleepy];
  34.  
  35. return ;
  36. }

oc66--代理模式应用2的更多相关文章

  1. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  2. 23种设计模式--代理模式-Proxy

    一.代理模式的介绍       代理模式我们脑袋里出现第一个词语就是代购,其实就是这样通过一个中间层这个中间成是属于什么都干什么都买得,俗称"百晓生",在平时得开发中我们经常会听到 ...

  3. Spring代理模式及AOP基本术语

    一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...

  4. Java设计模式之代理模式(Proxy)

    前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...

  5. 设计模式(十三):从“FQ”中来认识代理模式(Proxy Pattern)

    我们知道Google早就被墙了,所以FQ才能访问Google呢,这个“FQ”的过程就是一个代理的过程.“代理模式”在之前的博客中不止一次的提及过,之前的委托回调就是代理模式的具体应用.今天我们就从“F ...

  6. 设计模式(十三)代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  7. php实现设计模式之代理模式

    <?php /* * 代理模式 * 为其他对象提供一种代理以控制对这个对象的访问. * 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...

  8. PHP 代理模式

    代理模式:为其他对象提供一种代理以控制对这个对象的访问. [代理模式中主要角色] 抽象主题角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替. 代理主题角色:含有真实 ...

  9. java代理模式之静态代理

    作为一个初级开发者,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等.所以了解代理模式对于 ...

  10. 设计模式-代理模式(Proxy Model)

    文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/5988145.html 目录 1.写在前面 2.概述 3.目的 4.结构组成 5.实现 5 ...

随机推荐

  1. js让页面逐渐变透明,直到消失

    在gitHub闲逛的时候,无意间发现了些好玩的代码,一个歪果仁写的,这里我做了些修改和优化,gitHub链接已经忘了,是一段恶搞的js代码,假如你的顾客或者老板拖欠你工资,那你就可以让项目页面在浏览器 ...

  2. 在WEB项目中调用QQ通讯组件打开QQ聊天界面

    在很多WEB项目中,需要提供在线服务的功能,加上自己的联系方式,例如:QQ,不用添加QQ好友也可以交谈,那这到底是怎么实现的呢? 对于这个功能,需要提到一个组件,即“QQ通讯组件”.QQ通讯组件是一种 ...

  3. Python使用Flask框架,结合Highchart,搭配数据功能模块,加载 HTML 表格数据

    参考链接:https://www.highcharts.com.cn/docs/data-modules 1.javascript代码 var chart = Highcharts.chart('co ...

  4. Go:字符串操作

    Package strings:https://golang.google.cn/pkg/strings/ package main import ( "fmt" "st ...

  5. Missing message for key "xxx" in bundle "(default bundle)" for locale zh_CN

    参考文章http://programmerslounge.blogspot.com/2013/03/error-missing-message-for-key.html 错误的struts-confi ...

  6. 手机通过Charles用线上域名访问PC本地项目

    最近调试微信公众号,由于微信授权需要线上正式环境的域名,笔者想把手机公众号网页重定向到PC本地localhost调试. 该方法通过Charles代理转发,适用所有需要域名重定向的场景,例如手机通过在线 ...

  7. Tree(树的还原以及树的dfs遍历)

    紫书:P155 uva  548   You are to determine the value of the leaf node in a given binary tree that is th ...

  8. App后台开发运维和架构实践学习总结(4)——APP的注册和登录功能设计

    一.为什么需要注册和登录? 是否需要注册和登录的关键取决于产品形态. 如果用户注册登录对于用户需求.产品功能.商业模式本身带不来任何价值的话,就没必要设计这样的功能.比如一些实用工具类的产品:计算器. ...

  9. nyoj 1112 求次数(map, set)

    求次数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 题意很简单,给一个数n 以及一个字符串str,区间[i,i+n-1] 为一个新的字符串,i 属于[0,strl ...

  10. New Barns

    New Barns 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Farmer John notices that his cows tend to get into argument ...