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

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. View Programming Guide for iOS

    https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/Wi ...

  2. swift 工作日志

    开发问题汇总: tableview.register(CEImpWalletHomeCell.self, forCellReuseIdentifier: "cell") var c ...

  3. Linux命令运行监测和软件安装

    监测命令的运行时间 time command $ time sleep 5 real 0m5.003s # 程序开始至结束的时间,包括其它进程占用的时间片和IO时间 user 0m0.001s # 进 ...

  4. gitlab恢复、迁移

    文件说明 安装包:gitlab-ce_8.11.5-ce.0_amd64.deb 备份的数据:533751277_gitlab_backup.tar 系统:Ubuntu 16.04.4 LTS \n ...

  5. 3D赛瓦号——整装待发!

    随着岁末将至,twaver开发团队依旧马不停蹄,3d产品功能持续更新,新特效和功能目不暇接.现在,我们就利用一些新功能,制作一个全新“赛瓦号”飞船,大家看一下仿真程度是否有质的不同? 网页3d技术正在 ...

  6. 扒一扒PROMISE的原理,大家不要怕!

    在前端的日常工作中,回调函数(callback)应该是见怪不怪了,但是当回调函数遇上了异步(async),这就令人发指了.那么异步是什么意思呢,简单地说就是不等你执行完,就先执行下方的代码了. 举个

  7. [Luogu] P4626 一道水题 II

    ---恢复内容开始--- 题目描述 一天,szb 在上学的路上遇到了灰太狼. 灰太狼:帮我们做出这道题就放了你. szb:什么题? 灰太狼:求一个能被 [1,n] 内所有数整除的最小数字,并对 100 ...

  8. instance_name,db_name,oracle_sid之间的关系

    一]对ORACLE_SID的理解 --------------------------------------------------------------------------------Ora ...

  9. 教你如何使用Python写游戏辅助脚本

    主要实现方式是通过图片的对比,在游戏中就行点击.运行程序需要以下东西. PIL: 图片处理模块     (python3 换成了 pillow)  下载地址: https://www.lfd.uci. ...

  10. Mysql学习总结(42)——MySql常用脚本大全

    备份 (所有) C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqldump --no-defaults -hlocalhost -P3306 -u ...