iOS老司机可落地的中大型iOS项目中的设计模式优化Tips_桥接模式
我正在参加「掘金·启航计划」
1. 前言: 设计模式可以在大型项目中有哪些可落地的优化?
- 本人目前负责一个中大型iOS项目,用PPRows跑一下项目根文件,目前代码量约28W。
- 在这样一个大型项目中,我们组用了哪些方法对业务逻辑及代码架构进行解耦呢?
- 在这种代码量级的项目中,有哪些接地气的,可落地的优化经验呢?
- 在此抛砖引玉,欢迎大家一起相互探讨。
2. 落地: 采用桥接模式 应对同一页面网络数据接口来回变动的场景, 进行逻辑解耦.
2.1 桥接模式导图
2.2 桥接模式解耦, 核心类文件构成
2.3 桥接模式解耦, 核心代码文件讲解
2.3.1 定义一个抽象的基类BaseObjectA
- BaseObjectA.h文件 ```
import
import "BaseObjectB.h"
NS_ASSUME_NONNULL_BEGIN
@interface BaseObjectA : NSObject
/// 桥接模式的核心实现 @property (nonatomic, strong) BaseObjectB *objB;
/// 获取数据 - (void)handle;
@end
NS_ASSUME_NONNULL_END
- BaseObjectA.m文件
import "BaseObjectA.h"
@implementation BaseObjectA
/* A1 --> B1、B2 2种对应 A2 --> B1、B2 2种对应 / - (void)handle { // override to subclass 交给具体的子类复写 [self.objB fetchData]; }
@end ```
- 具体的页面A1
ObjectA1
ObjectA1.m
文件 ```
import "ObjectA1.h"
@implementation ObjectA1
- (void)handle { // before 业务逻辑操作
[super handle];
// after 业务逻辑操作 }
@end ```
- 不同接口的抽象父类
BusinessB.h
文件 ```
import
NS_ASSUME_NONNULL_BEGIN
@interface BaseObjectB : NSObject
- (void)fetchData;
@end
NS_ASSUME_NONNULL_END ```
- 不同接口的抽象父类
BusinessB.m
文件 ```
import "BaseObjectB.h"
@implementation BaseObjectB
- (void)fetchData { // override to subclass 交给子类实现 }
@end ```
- 具体使用的接口B2的实现
ObjectB.m
文件 ```
import "ObjectB2.h"
@implementation ObjectB2
- (void)fetchData { // B2具体的逻辑处理 NSLog(@"B2接口获取数据具体的逻辑处理 === "); }
@end ```
2.3.2 实际业务使用桥接模式示例
``` // // ViewController.m // appDesignPattern // // Created by JackLee on 2022/9/21. //
import "ViewController.h"
import "ObjectA1.h"
import "ObjectA2.h"
import "ObjectB1.h"
import "ObjectB2.h"
@interface ViewController ()
@end
@implementation ViewController
-
(void)viewDidLoad { [super viewDidLoad]; }
-
(void)touchesBegan:(NSSet
)touches withEvent:(UIEvent )event { // 测试桥接模式 [self testBridgeFetchData]; } -
(void)testBridgeFetchData { /* 根据实际业务判断使用哪套具体数据 A1 --> B1、B2 2种对应 A2 --> B1、B2 2种对应 /
// 创建一个具体的ClassA BaseObjectA objA = [ObjectA1 new]; // BaseObjectA objA = [ObjectA2 new];
// 创建一个具体的ClassB // BaseObjectB objB2 = [ObjectB1 new]; BaseObjectB objB2 = [ObjectB2 new]; // 将一个具体的ClassB2 指定给抽象BaseClassB objA.objB = objB2;
// A列表使用B2的接口获取数据 [objA handle]; } ```
发文不易, 喜欢点赞的人更有好运气👍 :), 定期更新+关注不迷路~
ps:欢迎加入笔者18年建立的研究iOS审核及前沿技术的三千人扣群:662339934,坑位有限,备注“掘金网友”可被群管通过~
- iOS老司机聊聊实际项目开发中的<<人月神话>>
- iOS老司机可落地在中大型iOS项目中的5大接地气设计模式合集
- iOS老司机的跨端跨平台Hybrid开发Tips
- iOS老司机的2022年回顾, 聊聊寒冬下的实用<<谈判力>>
- iOS老司机可落地的中大型iOS项目中的设计模式优化Tips_桥接模式
- iOS老司机的多线程PThread学习分享
- iOS老司机整理, iOSer必会的经典算法_2
- iOS老司机的<<蓝海转型>>读书分享
- iOS老司机的<<程序员的自我修养:链接、装载与库>>读书分享
- iOS老司机的接地气算法Tips
- iOS老司机的RunLoop原理探究及实用Tips
- iOS老司机整理, iOSer必会的经典算法_1
- iOS老司机的App启动优化Tips, 让启动速度提升10%
- iOS老司机的网络相关Tips
- 恋上数据结构与算法
- iOS老司机带你一起把App的崩溃率降到0.1%以下
- 探究Swift的String底层实现
- iOS老司机万字整理, 可能是最全的Swift Tips
- iOS老司机可落地的中大型iOS项目中的设计模式优化Tips
- 聊一聊Swift中的闭包