您的位置:首页 > 编程语言 > C语言/C++

第07天OC语言(04):代理设计模式

2017-07-19 00:00 399 查看
不要等到明天,明天太遥远,今天就行动。

#####须读:看完该文章你能做什么?

代理设计模式的基本概念
代理设计模式的使用场合

#####学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)

如何声明一个协议,协议的注意点

#####一、本章笔记

 1.什么是设计模式
     设计模式(design pattern) 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
     使用设计模式 是为了 可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式已于他人于系统 都是多赢的
     设计模式 使 代码编制真正工程化;
     设计模式 是软件工程的基石脉络,如同大夏的结构一样
 
 例子
     生活中大家一定遇到这样的情况了:
     比如 说
     我要买一包纸, 不妨就是心心相印。
     那么一般人的话 我应该不是去心心相印的工厂里面去直接买把。
     而是 我们在心心相印 专卖店 或者 什么超市的。
     这些地方购买。这些地方实际上就是洁丽雅毛巾的代理
     这气势和我们OO中的代理模式是很相似的。
 
 代理设计模式的场合
     当对象A 发生了一些行为, 想告诉 对象B(让对象B 称为对象A的代理对象)
     对象B 想监听对象A的行为 (让 对象B 成为对象A的代理对象)
     当对象A 无法处理某些行为的时候,想让对象B帮忙处理  (让 对象B 成为对象A的代理对象)

#####二、code
######main.m

#pragma mark 04-代理设计模式
#pragma mark - 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#import "Baby.h"
#import "Nanny.h"
#import "Student.h"
#import "Teacher.h"
#import "Dog.h"
#pragma mark - main函数
int main(int argc, const char * argv[])
{
    // 1.创建婴儿
    Baby *b = [Baby new];
    // 2.创建保姆
    Nanny *n = [Nanny new];
    // 3.将保姆赋值给婴儿
//    b.nanny = n;
    
    // 4.换保姆
    Student *s = [Student new];
#pragma mark 错误信息1
    /*
     b.nanny = s;  // incompatible pointer types assgining to 'Nanny *' from 'Student *'  保姆的对象 不是 学生的对象
     如果Student没有实现保姆的方法 就会报错2
     '-[Student feedFood:]: unrecognized selector sent to instance 0x100100620'
     */
//    b.nanny = s;
    
    // 5.再次换保姆
    Teacher *t = [Teacher new];
//    b.nanny = t;
    
    Dog *d = [Dog new];
    b.nanny = d;
    
    // 5.婴儿发飙
    [b food];
    [b sleeply];
    
    
    return 0;
}

######BabyProcotol

>>>.h
#import <Foundation/Foundation.h>
@class Baby;
@protocol BabyProcotol <NSObject>
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby;
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby;
@end

######Baby

>>>.h
#import <Foundation/Foundation.h>
#import "BabyProcotol.h"
@class Nanny,Student;
@interface Baby : NSObject
/*
  什么是代理设计模式
    心心相印 和 超市
    超市 就是心心相印的代理 它可以帮助 心心相印 买纸巾
    也就是说,代理也帮助 另外一个类做一些事情
  代理设计模式的应用场景
    1.当A对象 想 监听B对象的一些变化时,可以使用代理设计模式
        保姆想监听婴儿的变化,那么保姆就可以成为婴儿的代理,当婴儿发生变化之后 保姆就可以监听到
    2.当B对象发生一些事情,想通知 A 队形的时候,可以使用代理设计模式
        婴儿想通知保姆,那么就可以让保姆成为婴儿的代理,只要保姆成为婴儿的代理,以后婴儿发生变化 就可以通知保姆
    3.当对象A 无法处理某些行为的时候, 想让对象B帮忙处理(让对象B成为对象A的代理对象)
        婴儿无法吃东西,也无法自己入睡,所以可以通过保姆帮忙处理。只要让保姆成为婴儿的代理 就可以帮婴儿喂他吃东西 和哄她睡觉
 */

// 饥饿程度
@property (nonatomic,assign) int hungry;
// 睡意
@property (nonatomic,assign) int sleep;
// 让婴儿拥有一个保姆
//@property (nonatomic,strong) Nanny *nanny;
//@property (nonatomic,strong) Student *student;

// 如果使用id类来接收保姆,如果将来换保姆了,婴儿类不用修改代码
//@property (nonatomic,strong) id nanny;
// 引发出协议,作为保姆 必须要有 喂婴儿和 哄婴儿睡觉的方法
@property (nonatomic,strong) id<BabyProcotol> nanny;

// 吃东西
- (void)food;
// 睡觉
- (void)sleeply;
@end

>>>.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)sleeply
{
    self.sleep +=5;
    NSLog(@"困了 %i",self.sleep);
    // 通知保姆
    if ([self.nanny respondsToSelector:@selector(hongBady:)]) {
        [self.nanny hongBady:self];
    }

}

@end

######Nanny

>>>.h
#import <Foundation/Foundation.h>
#import "BabyProcotol.h"
@class Baby;
@interface Nanny : NSObject<BabyProcotol>

/*
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby;
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby;
*/

@end

>>>.m
#import "Nanny.h"
#import "Baby.h"
@implementation Nanny

// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby
{
    baby.hungry -= 10;
    NSLog(@"喂婴儿吃东西 %i",baby.hungry);    
}
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby
{
    baby.sleep += 10;
    NSLog(@"哄婴儿睡觉 %i",baby.sleep);
}
@end

######Student

>>>.h
#import <Foundation/Foundation.h>
#import "BabyProcotol.h"
@class Baby;
@interface Student : NSObject<BabyProcotol>
/*
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby;
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby;
 */
@end

>>>.m
#import "Student.h"
#import "Baby.h"
@implementation Student
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby
{
    baby.hungry -= 10;
    NSLog(@"喂婴儿吃东西 %i",baby.hungry);
}
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby
{
    baby.sleep += 10;
    NSLog(@"哄婴儿睡觉 %i",baby.sleep);
}
@end

######Teacher

>>>.h
#import <Foundation/Foundation.h>
#import "BabyProcotol.h"
@interface Teacher : NSObject<BabyProcotol>

@end

>>>.m
#import "Teacher.h"
#import "Baby.h"

@implementation Teacher
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby
{
    baby.hungry -= 10;
    NSLog(@"喂婴儿吃东西 %i",baby.hungry);
}
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby
{
    baby.sleep += 10;
    NSLog(@"哄婴儿睡觉 %i",baby.sleep);
}
@end

######Dog

>>>.h
#import <Foundation/Foundation.h>
#import "BabyProcotol.h"
@interface Dog : NSObject<BabyProcotol>

@end

>>>.m
#import "Dog.h"
#import "Baby.h"

@implementation Dog
// 喂婴儿吃东西
- (void)feedFood:(Baby *)baby
{
    baby.hungry -= 10;
    NSLog(@"喂婴儿吃东西 %i",baby.hungry);
}
// 哄婴儿睡觉
- (void)hongBady:(Baby *)baby
{
    baby.sleep += 10;
    NSLog(@"哄婴儿睡觉 %i",baby.sleep);
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OC语言