首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 設計模式:外觀模式 實戰範例

     編輯:關於C語言

模式動機

當子系統類別眾多、介面複雜時,提供一個**統一的高層介面** (Facade),讓客戶端能簡單完成常見任務,同時保留直接使用底層類別的彈性。

場景:組裝電腦

子系統:顯示器、主機板、CPU、記憶體、顯示卡… 各有複雜參數。

底層元件類別

@interface Display : NSObject
- (void)chooseDisplay:(NSString *)type;
@end
@implementation Display
- (void)chooseDisplay:(NSString *)type { NSLog(@"選擇顯示器:%@", type); }
@end

@interface MainBoard : NSObject
- (void)chooseMainBoard:(NSString *)type;
@end
@implementation MainBoard
- (void)chooseMainBoard:(NSString *)type { NSLog(@"選擇主機板:%@", type); }
@end

@interface CPU : NSObject
- (void)chooseCPU:(NSString *)type;
@end
@implementation CPU
- (void)chooseCPU:(NSString *)type { NSLog(@"選擇 CPU:%@", type); }
@end

專業用戶:手動組裝

@interface ProClient : NSObject
- (void)assembleCustom;
@end
@implementation ProClient
- (void)assembleCustom {
    Display *d = [Display new]; [d chooseDisplay:@"AOC 27\""];
    MainBoard *mb = [MainBoard new]; [mb chooseMainBoard:@"ASUS ROG"];
    CPU *cpu = [CPU new]; [cpu chooseCPU:@"i9-13900K"];
    // ... 記憶體、顯卡、電源...
}
@end

外觀類別:預配方案

@interface MacBookPro : NSObject
- (void)chooseConfiguration;
@end
@implementation MacBookPro
- (void)chooseConfiguration {
    Display *d = [Display new]; [d chooseDisplay:@"Samsung 13\" Retina"];
    MainBoard *mb = [MainBoard new]; [mb chooseMainBoard:@"Apple M2 Mainboard"];
    CPU *cpu = [CPU new]; [cpu chooseCPU:@"Apple M2 Pro"];
    // 內部封裝細節,客戶端無需知道
}
@end

普通用戶:一鍵購買

@interface CasualClient : NSObject
- (void)buyComputer;
@end
@implementation CasualClient
- (void)buyComputer {
    MacBookPro *mbp = [MacBookPro new];
    [mbp chooseConfiguration]; // 只需呼叫一個方法
}
@end

類別圖關係

Client (CasualClient)
    │
    ▼
Facade (MacBookPro)
    │
    ├──▶ Display
    ├──▶ MainBoard
    ├──▶ CPU
    └──▶ ... (其他子系統)

優缺點分析

優點缺點
降低客戶端與子系統耦合若外觀過於龐大,違反單一職責
簡化常見使用情境可能隱藏子系統重要細節
保留進階用法彈性 (繼續可直接用子系統)增加一層間接呼叫
利於分層架構 (Facade 作為層邊界)

實務應用場景

  • 網路層封裝:AFNetworking 的 AFHTTPSessionManager 是 NSURLSession 的外觀
  • 資料庫存取:Core Data 的 NSPersistentContainer 封裝 NSPersistentStoreCoordinator 等
  • 第三方 SDK 整合:自家 AnalyticsManager 封裝 Firebase、AppsFlyer、Adjust 等
  • 系統服務:FileManager、UserDefaults 皆是底層 C API 的外觀

Swift 版本 (現代寫法)

protocol DisplayChoosable { func chooseDisplay(_ type: String) }
protocol MainBoardChoosable { func chooseMainBoard(_ type: String) }
protocol CPUChoosable { func chooseCPU(_ type: String) }

struct MacBookProFacade {
    let display: DisplayChoosable
    let mainBoard: MainBoardChoosable
    let cpu: CPUChoosable

    func chooseConfiguration() {
        display.chooseDisplay("Samsung 13\" Retina")
        mainBoard.chooseMainBoard("Apple M2 Mainboard")
        cpu.chooseCPU("Apple M2 Pro")
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved