• 设计模式之Protocol实现代理模式


    • 使用场合
    • 使用步骤
    • 不使用protocol实现代理
    • 使用protocol实现代理

    一、使用场合

    1. A想让B帮忙,就让B代理
    2. A想通知B发生了一些事情,或者传一些数据给B
    3. 观察者模式

    二、使用步骤

    1. 定义一份协议
    2. B遵循协议,并且实现相应的方法
    3. A中定义一个代理属性:id <协议> delegate
    4. 创建B对象,将其附值给A的delegate属性

    三、不使用protocol实现代理

    首先不使用protocol来实现,这样就可以更好的对比:代理到底有什么好的。

    项目中使用到的类

    我们现在想让护士来照看孩子,如果孩子出现哭、吃、睡等行为时,护士立马相应,并且做出相应的动作

    Baby.h

    //
    //  Baby.h
    //  01-代理模式
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import <Cocoa/Cocoa.h>
    @class Nurse;
    
    @interface Baby : NSObject
    
    @property (nonatomic, assign) int age;
    @property (nonatomic, retain) Nurse *nurse;
    
    -(void)cry;
    -(void)eat;
    -(void)sleep;
    
    @end

    Baby.m

    //
    //  Baby.m
    //  01-代理模式
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import "Baby.h"
    #import "Nurse.h"
    
    @implementation Baby
    
    -(void)cry
    {
        NSLog(@"%d is crying", _age);
        [_nurse cry:self];
    }
    -(void)eat
    {
        NSLog(@"%d is hugry", _age);
        [_nurse eat:self];
    }
    -(void)sleep
    {
        NSLog(@"%d is sleep", _age);
        [_nurse sleep:self];
    }
    
    @end

    Nurse.h

    //
    //  Nurse.h
    //  01-代理模式
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    @class Baby;
    
    @interface Nurse : NSObject
    
    -(void)cry:(Baby*) bady;
    -(void)eat:(Baby*) bady;
    -(void)sleep:(Baby*) bady;
    
    @end

    Nurse.m

    //
    //  Nurse.m
    //  01-代理模式
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import "Nurse.h"
    
    @implementation Nurse
    
    -(void)cry
    {
        NSLog(@"哄孩子");
    }
    -(void)eat
    {
        NSLog(@"喂孩子");
    }
    -(void)sleep
    {
        NSLog(@"让孩子睡觉");
    }
    
    @end

    main.m

    //
    //  main.m
    //  01-代理模式2
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Baby.h"
    #import "Nurse.h"
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            Nurse *nurse = [[Nurse alloc] init];
            
            Baby *baby = [[Baby alloc] init];
            baby.nurse = nurse;
            [baby cry];
        }
        return 0;
    }

    似乎这样的实现,并没有什么问题,但是如果有一天,护士突然不照护孩子了,我们将孩子交给一个老师来照料,是不是很多内容还改?

    甚至有一天老师也不照料了,我们给孩子的爷爷奶奶来照料,又需要改很多内容

    所以,我们可以使用protocol来实现

    四、使用protocol实现代理

    1⃣️我们先定义一份协议

    //
    //  LookBaby.h
    //  01-代理模式3
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    @class Baby;
    
    @protocol LookBaby <NSObject>
    
    -(void)cry:(Baby*) baby;
    -(void)eat:(Baby*) baby;
    -(void)sleep:(Baby*) baby;
    
    @end

    2⃣️Nurse遵循协议,且实现协议中的方法

    .h

    //
    //  Nurse.h
    //  01-代理模式
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "LookBaby.h"
    @class Baby;
    
    @interface Nurse : NSObject <LookBaby>
    
    @end

    .m

    //
    //  Nurse.m
    //  01-代理模式
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import "Nurse.h"
    
    @implementation Nurse
    
    -(void)cry:(Baby*)baby
    {
        NSLog(@"哄孩子");
    }
    -(void)eat:(Baby*)baby
    {
        NSLog(@"喂孩子");
    }
    -(void)sleep:(Baby *)baby
    {
        NSLog(@"哄孩子睡觉");
    }
    
    @end

    3⃣️Baby定义一个实现协议的属性

    .h

    //
    //  Baby.h
    //  01-代理模式
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import <Cocoa/Cocoa.h>
    #import "LookBaby.h"
    @class Nurse;
    
    @interface Baby : NSObject
    
    @property (nonatomic, assign) int age;
    @property (nonatomic, retain) id <LookBaby> loolBaby;
    
    -(void)cry;
    -(void)eat;
    -(void)sleep;
    
    @end

    .m

    //
    //  Baby.m
    //  01-代理模式
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import "Baby.h"
    #import "Nurse.h"
    
    @implementation Baby
    
    -(void)cry
    {
        NSLog(@"%d is crying", _age);
        [_loolBaby cry:self];
    }
    -(void)eat
    {
        NSLog(@"%d is hugry", _age);
        [_loolBaby eat:self];
    }
    -(void)sleep
    {
        NSLog(@"%d is sleep", _age);
        [_loolBaby sleep:self];
    }
    
    @end

    4⃣️创建B对象,设置A的delegate属性为B对象

    //
    //  main.m
    //  01-代理模式3
    //
    //  Created by apple on 14-4-2.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Baby.h"
    #import "Nurse.h"
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            Nurse *nurse = [[Nurse alloc] init];
            Baby *baby = [[Baby alloc] init];
            
            baby.loolBaby = nurse;
            baby.age = 10;
            
            [baby eat];
            
        }
        return 0;
    }
  • 相关阅读:
    第一章--linux基础
    深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)
    LeetCode Letter Combinations of a Phone Number
    ios 仿android gallery控件
    android何如获取SIM卡提供国家代码(ISO)
    android 获取 imei号码
    overridePendingTransition的简介
    转 Android Activity之间动画完整版详解
    【android开发】使用PopupWindow实现页面点击顶部弹出下拉菜单
    Android 带你从源码的角度解析Scroller的滚动实现原理
  • 原文地址:https://www.cnblogs.com/letougaozao/p/3640403.html
Copyright © 2020-2023  润新知