需求背景
这是一次项目优化需求,目前工程中的关注按钮应用场景比较多,如:关注用户,关注话题,关注课程,关注标签,关注评论,关注频道, 等等
这些关注功能都是通过同一个按钮来实现的,由于不同的关注类型使用的是
不同类型的对象模型,导致 关注按钮中的判断逻辑越来越多,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