记一次适配器模式在iOS开发中的实际应用

需求背景

这是一次项目优化需求,目前工程中的关注按钮应用场景比较多,如:关注用户,关注话题,关注课程,关注标签,关注评论,关注频道, 等等
这些关注功能都是通过同一个按钮来实现的,由于不同的关注类型使用的是
不同类型的对象模型,导致 关注按钮中的判断逻辑越来越多,UI也越来越复杂,造成了添加新业务就非常难以维护,整个代码越来越臃肿也不可维护

可以看一下重构之前的代码

请添加图片描述

请添加图片描述

再看下关注成功之后发送通知的地方,
同样的多种类型的判断,对后续的开发很是不友好
请添加图片描述

适配器模式

原理:

将一个类的接口转换成客户希望的另一个接口, 使原本由于接口不兼容而不能一起工作的那些类可以一起工作。

实现方式:

增加一个适配器对象,适配器对数据模型有一个引用,关注按钮不直接访问数据模型,而是访问适配器,适配器通过判断不同的数据类型 从而访问不同的接口。

请添加图片描述

实现代码

增加一个适配器
请添加图片描述

按钮只支持适配器类型,通过统一的接口访问
请添加图片描述

set 方法只保留一个,极大简化代码,便于后续维护
请添加图片描述

请添加图片描述

代码段

//
//  TPAttentionModelAdapter.m
//  ThePaperBase
//
//  Created by liubo on 2022/4/16.
//  Copyright © 2022 scar1900. All rights reserved.
//

#import "TPAttentionModelAdapter.h"

@implementation TPAttentionModelAdapter

@synthesize isOrder = _isOrder;

- (NSString *)identifier
{
    if ([self.model isKindOfClass:[userBO class]]) {
        return ((userBO *)self.model).userId;
    }
    
    if ([self.model isKindOfClass:[nodeObjectBO class]]) {
        return ((nodeObjectBO *)self.model).nodeId;
    }
    
    if ([self.model isKindOfClass:[specialObjectBO class]]) {
        return ((specialObjectBO *)self.model).nodeId;
    }
    
    if ([self.model isKindOfClass:[govAffairsNumBO class]]) {
        return ((govAffairsNumBO *)self.model).govId;
    }
    
    if ([self.model isKindOfClass:[TopicInfoBO class]]) {
        return ((TopicInfoBO *)self.model).topicId;
    }
    
    if ([self.model isKindOfClass:[commentObjectVO class]]) {
        return ((commentObjectVO *)self.model).commentId;
    }
    
    if ([self.model isKindOfClass:[DetailTagBO class]]) {
        return ((DetailTagBO *)self.model).tagId;
    }
    
    if ([self.model isKindOfClass:[listContObjectVO class]]) {
        return ((listContObjectVO *)self.model).courseId;
    }
    return @"";
}

- (void)setIsOrder:(NSString *)isOrder
{
    _isOrder = isOrder;
    if ([self.model isKindOfClass:[userBO class]]) {
        ((userBO *)self.model).isOrder = isOrder;
    } else if ([self.model isKindOfClass:[nodeObjectBO class]]) {
        ((nodeObjectBO *)self.model).isOrder = isOrder;
    } else if ([self.model isKindOfClass:[specialObjectBO class]]) {
        ((specialObjectBO *)self.model).isOrder = isOrder;
    } else if ([self.model isKindOfClass:[govAffairsNumBO class]]) {
        ((govAffairsNumBO *)self.model).isOrder = isOrder;
    } else if ([self.model isKindOfClass:[TopicInfoBO class]]) {
        ((TopicInfoBO *)self.model).isAttented = isOrder;
    } else if ([self.model isKindOfClass:[commentObjectVO class]]) {
        ((commentObjectVO *)self.model).isAttented = isOrder;
    } else if ([self.model isKindOfClass:[DetailTagBO class]]) {
        ((DetailTagBO *)self.model).isOrder = isOrder;
    } else if ([self.model isKindOfClass:[listContObjectVO class]]) {
        ((listContObjectVO *)self.model).isOrder = isOrder;
    }
}

- (NSString *)isOrder
{
    if ([self.model isKindOfClass:[userBO class]]) {
        return  ((userBO *)self.model).isOrder;
    } else if ([self.model isKindOfClass:[nodeObjectBO class]]) {
        return  ((nodeObjectBO *)self.model).isOrder ;
    } else if ([self.model isKindOfClass:[specialObjectBO class]]) {
        return  ((specialObjectBO *)self.model).isOrder;
    } else if ([self.model isKindOfClass:[govAffairsNumBO class]]) {
        return  ((govAffairsNumBO *)self.model).isOrder;
    } else if ([self.model isKindOfClass:[TopicInfoBO class]]) {
       return ((TopicInfoBO *)self.model).isAttented;
    } else if ([self.model isKindOfClass:[commentObjectVO class]]) {
       return ((commentObjectVO *)self.model).isAttented;
    } else if ([self.model isKindOfClass:[DetailTagBO class]]) {
       return ((DetailTagBO *)self.model).isOrder;
    } else if ([self.model isKindOfClass:[listContObjectVO class]]) {
        return ((listContObjectVO *)self.model).isOrder;
    }
    return @"0";
}

@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值