iOS老司机可落地的中大型iOS项目中的设计模式优化Tips_桥接模式

语言: CN / TW / HK

我正在参加「掘金·启航计划」

1. 前言: 设计模式可以在大型项目中有哪些可落地的优化?

  • 本人目前负责一个中大型iOS项目,用PPRows跑一下项目根文件,目前代码量约28W。
  • 在这样一个大型项目中,我们组用了哪些方法对业务逻辑及代码架构进行解耦呢?
  • 在这种代码量级的项目中,有哪些接地气的,可落地的优化经验呢?
  • 在此抛砖引玉,欢迎大家一起相互探讨。

image.png

2. 落地: 采用桥接模式 应对同一页面网络数据接口来回变动的场景, 进行逻辑解耦.

2.1 桥接模式导图

image.png

2.2 桥接模式解耦, 核心类文件构成

image.png

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,坑位有限,备注“掘金网友”可被群管通过~