OC学习 第九节 代理协议

来源:互联网 发布:如何锻炼口才 知乎 编辑:程序博客网 时间:2024/04/29 05:35
day9 代理和协议
================


代理设计模式
比如工人工作,要求发工资,他自己不能给他自己发工资,由老板发工资,老板在这里就是工人的代理

比如工人工作之后,老板要发工资,老板对财务不太懂,委托给财务人员发工资
财务就是老板的代理,他负责发工资给员工。

你要注册公司,要去工商局注册。交给托管公司给跑,他们帮你注册公司。
在这里,托管公司就是你的代理。


协议初步(UI中应用:大量的项目)
一、协议
1.什么是协议
就业协议  
贷款协议
购房
租房:
劳动合同:

协议:
两个事物之间达成某些约定
协议规定了遵守协议的事物

找男友
满足以下协议(条件)的人可以做我男朋友

协议名:《征猪条款》 <LookPigItem>  
一系统条款:
0. 男的,活的 - (void)liveMan;
1. 以老婆为中心 - (void)centerWife;
2. 以疼老婆爱老婆为宗旨 - (void)loveWife;
3. 工资上交 - (void)salarySubmit;
4. 不得和其他女生暧昧 …
5. 洗衣服 …
6. 做饭
7. 不得打骂老婆
8. 身高 …
9. 学iOS的 - (void)iOSProgrammerMonkey;



员工&老板
老板要发工资,老板实现发工资的协议
《发工资条款》
<PaySalary>

- (void)paySalaryToWorker:(Worker *)worker {}

Worker
// @property (nonatomic, assign) Boss *myBoss;
@property (nonatomic, assign) id<PaySalary> myBoss;

Boss *boss = [[Boss alloc] init];
Worker *worker = [[Worker alloc] init];
worker.myBoss = boss;
Boss遵守<PaySalary>协议,并实现协议的方法(执行协议),这样Boss才有资作为worker.myBoss

条款由谁制定?
主动方制定。谁是方动方?worker.myBoss,这个指针指向能实现协议的对象,我这个指针不是随便乱指的,要想让我指向你,你就得遵守我的规定(要能发得起工资)。员工是主动方,员工制定协议。

员工有一个myBoss指针,指向实现协议的对象。老板实现协议,被动方。

// 协议就是来规范接口
    ▪    比如USB接口(不管什么牌子的USB查到电脑上都认识)
    ▪    网线水晶头的网线也是遵守协议的
    ▪    鼠标口, 键盘口都是有协议的
    ▪    协议 作用:规范接口
协议举例


2.代码中的协议
OC    @protocol
java   接口
c++    抽象类

OC协议
规定了遵从协议的类,需要实现的方法
这个类遵守协议之后,这个类的实例对象也就遵守了协议
类通过尖括号遵从协议,实现要求的方法

3.协议的应用与功能
a.应用
    1.(主要功能)规范接口(协议规范接口是强制的)

    2. 实现委托代理机制(实现对象之间的通信)  代理设计模式(iOS中常见)
            规范代理的行为-》传值

b.功能
    ▪    协议就是为了满足统一的数据传输
    ▪    一个类只能继承一个直接的父类,但可以通过实现多个接口(遵守多个协议),间接的实现了多继承.

协议练习
1.排序规范接口
//动物收容所
/* AnimalHome
    1. 收听话的动物(动物要听话,实现听话方法)
    2. 对不同的动物进行身高排序(不同动物的比较身高的方法 有可能不同)
*/

2.实现类似c++的多继承

现在有多个类,一个是加法器类(会算加法) 第二个类是减法器类(减法功能)第三个乘法器类(乘法)第四个除法类

Computer 继承于上面这四个类

实现一个类分别可以进行+-*/

c++可以用多继承实现
但是OC没有多继承 但是OC可以通过协议来实现


二、代理&协议

代理 是iOS的一种设计模式 一种技术
协议:Objective-C的语法  作用:规范接口

委托就是代理
A委托 B做一些事情   (B是A的代理)
或者B委托A做什么   
用协议来规范代理的行为

2.反向传值

代理练习

1.买木头
  老板张  不会买木头  
  员工王  会买木头

老板张委托员工王 买木头
老板制定协议(买木头)

模拟这个过程

公司老板  不会开车 招聘一个司机  协议(会开车)
worker  li  会开车
老板 招聘li  作为司机
老板就可以委托 li  开车

模拟上述过程
只要发生了委托关系 那么就是代理设计模式

协议的功能 仍然是规范方法

练习:

1.创建广播站类和收音机类
广播站
方法:
    播音(参数是一个字符串)

制定协议:接收广播

使用代理要注意的地方

收音机
方法:
    收音并播放(参数也是字符串)  实现播放协议

作业.
用代理设计模式,结合协议写一个示例
程序员打代码 程序员要求老板发工资(程序员本身发不了工资),把老板作为代理
老板发工资

- (void)go {
    /** 这种写法可以
    Worker *worker = [[Worker alloc] init];
    self.worker = worker; // [self setWorker:worker]
    [worker release];
     */
    
    self.worker = [[[Worker alloc] init] autorelease];
    
    // 下面这种写法也可以,但是不建议这样做
    // self.worker = [[Worker alloc] init];
    // [_worker release]; // 对成员变量的release应该放在dealloc中,因为成员变量是对象的一个成员,应当随着对象生命的终结而消失,所以说一般来讲,对成员变量(对象)的释放理应放在dealloc中,因为dealloc代表当前对象的释放
    
    _worker.myBoss = self; // 让员工知道老板
    [_worker work];
}

// 实现协议方法
- (void)paySalary:(Worker *)worker {
    NSLog(@"老板要发工资了...");
    [worker receiveMoney:1000];
    
    // [self.worker receiveMoney:1000];
    // 用self.worker也可以,因为我们现在就一个员工
}

- (void)passValue:(NSString *)str {
    NSLog(@"%@", str);
}

- (void)dealloc {
    [_worker release];
    
    NSLog(@"%s", __func__);
    [super dealloc];
}


@implementation Worker

- (void)work {
    for (int i = 0; i < 3; i++) {
        NSLog(@"干活...");
        sleep(2);
    }
    
    [self workEnd];
}

- (void)workEnd {
    // 要求实现协议的 _myBoss 发工资, 调用 _myBoss 的paySalary:方法
    // paySalary:方法是协议中的一个条款项,_myBoss遵守了协议,实现协议中的条款 paySalary:
    [self.myBoss paySalary:self];
    
    [self.myBoss passValue:@"可以给我涨工资了!"];
}

- (void)receiveMoney:(float)money {
    NSLog(@"员工收到了工资:¥%f", money);
}

- (void)dealloc {
    NSLog(@"%s", __func__);
    [super dealloc];
}

@end


0 0
原创粉丝点击