适配器模式(Adapter Pattern)

2022-09-12  本文已影响0人  long弟弟

适配器模式

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

适配器模式有两种实现方式:类适配器和对象适配器。

类适配器模式.jpg 对象适配器模式.jpg

角色和职责

  1. Client
    与符合Target接口的对象协同。
  2. Adapter
    Adaptee的接口与Target进行适配
  3. Target
    定义Client使用的与特定领域相关的接口。
  4. Adaptee
    定义一个已经存在的接口,这个接口需要适配

代码示例

类适配器

#import <Foundation/Foundation.h>
//被适配的类
@interface Adaptee : NSObject
@end
@implementation Adaptee
//输出220V电压
- (NSInteger)output220V {
    NSInteger src = 220;
    NSLog(@"电压%ld伏", src);
    return src;
}
@end

//适配接口
@protocol ITarget <NSObject>
- (NSInteger)output5V;
@end

//适配器类
@interface Adapter : Adaptee <ITarget>
@end
@implementation Adapter
- (NSInteger)output5V {
    NSInteger srcV = [self output220V];
    NSInteger dstV = srcV / 44;
    return dstV;
}
@end

@interface Phone : NSObject
@end
@implementation Phone
//充电方法
- (void)charging:(id<ITarget>)iTarget {
    if ([iTarget output5V] == 5) {
        NSLog(@"电压为5V,可以充电");
    }else {
        NSLog(@"电压大于5V,不能充电");
    }
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"类适配器");
        Phone *phone = [[Phone alloc] init];
        [phone charging:[[Adapter alloc] init]];
    }
    return 0;
}
/*
类适配器
电压220伏
电压为5V,可以充电
*/

对象适配器

#import <Foundation/Foundation.h>
//被适配的类
@interface Adaptee : NSObject
@end
@implementation Adaptee
//输出220V电压
- (NSInteger)output220V {
    NSInteger src = 220;
    NSLog(@"电压%ld伏", src);
    return src;
}
@end

//适配接口
@protocol ITarget <NSObject>
- (NSInteger)output5V;
@end

//适配器类
@interface Adapter : NSObject <ITarget>
@property (nonatomic, strong) Adaptee *adaptee;
@end
@implementation Adapter
//初始化方法创建adaptee或者setter方法都可以(聚合)
- (instancetype)init {
    if (self = [super init]) {
        self.adaptee = [[Adaptee alloc] init];
    }
    return self;
}
- (NSInteger)output5V {
    NSInteger srcV = [self.adaptee output220V];
    NSInteger dstV = srcV / 44;
    return dstV;
}
@end

@interface Phone : NSObject
@end
@implementation Phone
//充电方法
- (void)charging:(id<ITarget>)iTarget {
    if ([iTarget output5V] == 5) {
        NSLog(@"电压为5V,可以充电");
    }else {
        NSLog(@"电压大于5V,不能充电");
    }
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"对象适配器");
        Phone *phone = [[Phone alloc] init];
        [phone charging:[[Adapter alloc] init]];
    }
    return 0;
}
/*
对象适配器
电压220伏
电压为5V,可以充电
*/

针对这两种实现方式,在实际开发中,选择使用哪一种呢?判断的标准主要有两个,一个是Adaptee接口的个数,另一个是Adaptee和Target的契合程度。

用处

一般来说,适配器模式是一种“补偿模式”,用来补救设计上的缺陷。如果设计就协调好规避接口掉接口不兼容的问题,那么这种模式就没有应用的机会了。

  1. 封装有缺陷的接口设计
  2. 统一多个类的接口设计
  3. 替换依赖的外部系统
  4. 兼容老版本接口
  5. 适配不同格式的数据

iOS中可以这么理解:一个现有类需要适应变化的问题。
Model映射成ViewModel

ViewModel.jpg

角色和职责

  1. 适配器
    VM
  2. 成员变量
    持有引用属性
  3. 被适配对象
    Model

优点

类适配器

对象适配器

缺点

类适配器

对象适配器

上一篇下一篇

猜你喜欢

热点阅读