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中的閉包