iOS常用设计模式之委托模式

引言

在代理模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。

目录

  • 1、什么是代理模式
  • 2、使用代理模式的优点
  • 3、什么时候使用代理模式
  • 4、代理模式一般涉及到的角色
  • 5、Objective-C的代理模式实现

1、什么是代理模式

对其他对象提供一种代理以控制对这个对象的访问。

2、使用代理模式的优点

(1)职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,
            通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2)代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
(3)高扩展性

3、什么时候使用代理模式

在对已有的方法进行使用的时候出现需要对原有方法进行改进或者修改,这时候有两种改进选择:修改原有方法来适应现在的使用方式,或者使用一个“第三者”方法来调用原有的方法并且对方法产生的结果进行一定的控制。第一种方法是明显违背了“对扩展开放、对修改关闭”(开闭原则),而且在原来方法中作修改可能使得原来类的功能变得模糊和多元化(就像现在企业多元化一样),而使用第二种方式可以将功能划分的更加清晰,有助于后面的维护。所以在一定程度上第二种方式是一个比较好的选择!

4、代理模式一般涉及到的角色

抽象角色:声明真实对象和代理对象的共同接口;

代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

5、Objective-C的代理模式实现

现在借助主人和仆人的角色来讲解代理模式。我们想象一下,主人想喝水,需要去买水,但主人不知道怎么去买水,那他叫仆人去帮他买水,仆人听到命令就去买水,仆人买完水再交给主人,这个时候主人就有水喝了。

现在我们用Objective-C来实现这个过程

新建一个Servant协议类

1
2
3
4
5
#import <Foundation/Foundation.h>
@protocol ServantProtocol <NSObject>
- (void) finishedBuyWater;
- (void) finishedBuyWaterError;
@end

新建一个仆人Servant类,.h文件如下:

1
2
3
4
5
6
7
 #import <Foundation/Foundation.h>
  #import "ServantProtocol.h"

  @interface Servant : NSObject
  @property (nonatomic,assign) id<ServantProtocol> delegate;
  - (void) buyWater;
  @end

.m文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
#import "Servant.h"

@implementation Servant
- (void) buyWater:(NSInteger)money
{
  if (money > 2) {
      [self.delegate finishedBuyWater];
  }else{
      [self.delegate finishedBuyWaterError];
  }
}
@end

新建一个Master类,.h文件如下:

1
2
3
4
5
6
#import <Foundation/Foundation.h>
#import "ServantProtocol.h"

@interface Master : NSObject<ServantProtocol>
- (void) drinkWater;
@end

.m文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#import "Master.h"
#import "Servant.h"

@implementation Master

- (void) drinkWater
{
  Servant * servant = [[Servant alloc] init];
  servant.delegate = self;
  // 命令仆人去买水
  [servant buyWater];
}

#pragma mark - ServantProtocol
- (void) finishedBuyWater
{
  NSLog(@"完成买水");
}

- (void) finishedBuyWaterError
{
  NSLog(@"买水出错");
}
@end





Comments