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,坑位有限,備註“掘金網友”可被群管通過~