Oh!Coder

Coding Life

Objective C--适配器模式

| Comments

今天和大家分享的是适配器模式。适配器模式很简单,想必很多同学可能已经用过。好的,还是先给出简短的定义吧。

适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器模式主要解决了什么问题呢?

答:系统的数据和行为都正确,但接口不符时,我们应该考虑适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

其实,简单的说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它。

在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式,由于类适配器模式通过多重继承对接一个接口与另一个接口进行适配,而Objective C语言不支持多重继承(协议除外,:D),所以这里还是先分享一下对象适配器吧,有兴趣的同学可以找找相关资料。

好的,让我们看一看他的类结构图吧。

pic

看起来不难吧,搞了那么多的专业术语,其实就是对接口的再一次封装而已。好吧,不啰嗦了,下面就展示一下代码吧。

注意:本文所有代码均在ARC环境下编译通过。

  • Target类接口
1
2
3
4
5
#import <Foundation/Foundation.h>

@interface Target:NSObject
-(void)Request;
@end
  • Target类实现
1
2
3
4
5
6
7
8
#import "Target.h"

@implementation Target

-(void)Request{
    NSLog(@"普通请求!");
}
@end
  • Adaptee类接口
1
2
3
4
5
#import <Foundation/Foundation.h>

@interface Adaptee:NSObject
-(void)SpecificRequest;
@end
  • Adaptee类实现
1
2
3
4
5
6
7
8
#import "Adaptee.h"

@implementation Adaptee

-(void)SpecificRequest{
    NSLog(@"特殊请求!");
}
@end
  • Adapter类接口
1
2
3
4
5
6
7
#import "Target.h"

@class Adaptee;
@interface Adapter :Target{
    Adaptee *adaptee;
}
@end
  • Adapter类实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import "Adapter.h"
#import "Adaptee.h"

@implementation Adapter

-(id)init{
    if (self == [super init]) {
        adaptee = [[Adaptee alloc]init];
    }
    return self;
}
-(void)Request{
    [adaptee SpecificRequest];
}
@end
  • Main方法调用
1
2
3
4
5
6
7
8
9
10
11
#import <Foundation/Foundation.h>
#import "Adapter.h"

int main(int argc,const char *argv[])
{
    @autoreleasepool{
        Target *target = [[Adapter alloc]init];
        [target Request];
    }
    return 0;
}

好啦,今天的代码很简短吧,呵呵。

Comments