相信凡是接触过编程语言的人都会多多少少接触到一种设计模式—-代理模式。今天我就OC来说说代理模式的具体原理吧!
首先我们先了解一下具体的代理含义,不知道有没有人在设计类的时候遇到这样的问题:假如我们事先创建了两个不同属性功能的类A与类B,如果我们想在类A中使用B中的某个功能,我们可能会马上想到在A类中创建B类的对象,然后通过B类的对象来使用B类的方法(或者使用B类中的类方法)来达到使用的目的,这种方案叫做类的组合。虽然这样虽然也达到了我们的具体实现的功能,但是,如果A类还要用一个C类的方法的话,我们是不是也要在A类中继续创建一个C类的对象以达到目的呢?那么在想,如果A类中要使用很多很多类的方法,我们难道要依次创建每个类的对象吗?这样问题就来了,如果是这样的话,功能虽然也能实现,但是程序的耦合性变得异常高,假如我要再去想办法修改一个类的一些方法,那么就牵扯到了我们的A类,因为在A类中我用的是其他类的方法,而不是自己的,所以总是跟外界有关系,外界的变化对于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;
}
运行结果如下:
这个例子很简单,很容易理解,其实协议里面最重要的是代理传值,下次再写喽!今天就说到这里吧!