OC中的代理模式(初级)

相信凡是接触过编程语言的人都会多多少少接触到一种设计模式—-代理模式。今天我就OC来说说代理模式的具体原理吧!
首先我们先了解一下具体的代理含义,不知道有没有人在设计类的时候遇到这样的问题:假如我们事先创建了两个不同属性功能的类A与类B,如果我们想在类A中使用B中的某个功能,我们可能会马上想到在A类中创建B类的对象,然后通过B类的对象来使用B类的方法(或者使用B类中的类方法)来达到使用的目的,这种方案叫做类的组合。虽然这样虽然也达到了我们的具体实现的功能,但是,如果A类还要用一个C类的方法的话,我们是不是也要在A类中继续创建一个C类的对象以达到目的呢?那么在想,如果A类中要使用很多很多类的方法,我们难道要依次创建每个类的对象吗?这样问题就来了,如果是这样的话,功能虽然也能实现,但是程序的耦合性变得异常高,假如我要再去想办法修改一个类的一些方法,那么就牵扯到了我们的A类,因为在A类中我用的是其他类的方法,而不是自己的,所以总是跟外界有关系,外界的变化对于A类影响是巨大的。
这里,代理模式的设计理念很巧妙的解决了这个问题,它的存在极大的降低了程序的耦合性。我们先看看代理模式的关系图吧!如下:

B类此时就是A类的一个代理
此时B类实际上就是A类的一个代理。怎么去理解呢?A类想去做某件事情,此时他不想直接去找特定的某个人去做这件事儿,于是呢,A类试图制定一个协议,协议里包含了自己要做这件事情的具体内容(在程序中就是A类所要使用的一些方法,这些方法实质就是一些接口),好了A类中一旦制定了这些方法,就不会再去想外部谁来做这个事儿(反正总是会有人来做的),此时依据自己制定的协议的内容,A类可以直接使用自己想用到的一些方法,而外界如果有人想去帮A类来做事情就很简单了,比如B类来帮A类来做事情,它只需要遵守A类制定的协议即可,实质跟A类并不存在直接的联系。此时功能也一样实现了。但是需要注意一点的是,B类跟A类的联系只是一个协议,而协议是针对于所有的类的,不仅仅针对B类的。B类只是间接的帮A做事,所以耦合性很低。
好了,我们写一个简单的demo来看看OC中具体是如何去实现的吧!
我们首先创建两个类,分别是A类与B类,如下:

//
//  ClassA.h
//  代理模式Demo
//
//  Created by Lee on 15-9-5.
//  Copyright (c) 2015年 Lee. All rights reserved.
//

#import <Foundation/Foundation.h>
//声明协议
@protocol ClassADelegate <NSObject>

- (void) buyGoods;

- (void) bringRice;

@end

@interface ClassA : NSObject
//声明协议属性
@property (nonatomic,strong)id <ClassADelegate> delegate;

- (void)beginDoDelegate;

@end
#import "ClassA.h"

@implementation ClassA

- (void)beginDoDelegate{

    NSLog(@"老子饿了,找个代理帮我买点东西");

    [_delegate buyGoods];

    [_delegate bringRice];
}

然后让B类去遵守A类所制定的协议,如下:

//
//  ClassB.h
//  代理模式Demo
//
//  Created by Lee on 15-9-5.
//  Copyright (c) 2015年 Lee. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ClassA.h"

@interface ClassB : NSObject<ClassADelegate>

@end
//
//  ClassB.m
//  代理模式Demo
//
//  Created by Lee on 15-9-5.
//  Copyright (c) 2015年 Lee. All rights reserved.
//

#import "ClassB.h"

@implementation ClassB

- (void)buyGoods{

    NSLog(@"老大,我是B类,我帮你买点干货吃");
}

- (void)bringRice{

    NSLog(@"老大,我是B类,给你买饭了");
}

@end
//
//  main.m
//  代理模式Demo
//
//  Created by Lee on 15-9-5.
//  Copyright (c) 2015年 Lee. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ClassA.h"
#import "ClassB.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");

        ClassA *a = [[ClassA alloc]init];

        //B类是A类的一个代理,我们要将B类传给A的属性代理
        ClassB *b = [[ClassB alloc]init];
        a.delegate = b;

        //A类开始请求代理替他办事儿了
        [a beginDoDelegate];

    }
    return 0;
}

运行结果如下:
这里写图片描述
这个例子很简单,很容易理解,其实协议里面最重要的是代理传值,下次再写喽!今天就说到这里吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值