• oc66--代理模式应用2


    //
    //  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 += 5;
        NSLog(@"要吃东西 %i", self.hungry);
        // 通知保姆
        if ([self.nanny respondsToSelector:@selector(feedFood:)]) {
            
            [self.nanny feedFood:self];
        }
    }
    
    - (void)sleepy
    {
        self.sleep += 5;
        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 -= 10;
        NSLog(@"喂婴儿吃东西 %i", baby.hungry);
    }
    
    - (void)hongBaby:(Baby *)baby
    {
        baby.sleep += 10;
        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 -= 10;
        NSLog(@"喂婴儿吃东西 %i", baby.hungry);
    }
    
    - (void)hongBaby:(Baby *)baby
    {
        baby.sleep += 10;
        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 0;
    }
  • 相关阅读:
    Struts框架之结果页面的跳转
    eclipse中运行tomcat提示端口被占的4种解决方案
    在Struts2框架中使用Servlet的API
    Struts2框架之Action类的访问
    判断有无网
    UITextField银行卡加空格
    关于UI_USER_INTERFACE_IDIOM() & UIDevice.model
    OC导航栏跳转指定界面
    oc UIAlertController封装
    升级到macSierra 10.12之后 在模拟器上面滑动视图很卡,
  • 原文地址:https://www.cnblogs.com/yaowen/p/7437248.html
Copyright © 2020-2023  润新知