この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
ごく普通のiOSアプリ開発でよくある状況や
Swiftのコアライブラリやフレームワークで使われているパターンに
着目してデザインパターンを学び直してみた記録です。
関連記事一覧
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン
Bridgeパターン概要
- 機能を提供する層と、実装を提供する層を分離するパターンです。
- 各層の橋渡し(Bridge)をiOSエンジニアにはおなじみの委譲(delegate)で行います。
- GoFのデザインパターンでは構造に関するパターンに分類されます。
使い所
- 実装をMockに差し替えることができ、ユニットテストがしやすくなります。
- VIPERなどのアーキテクチャーパターンは、Bridgeパターンによって成立しています(と私は認識しています)。
サンプルコード
Swiftバージョンは 5.1 です。
// VIPERでのPresenterに当たる層
protocol Presentation {
var interactor: Usecase { get set }
func searchButtonTapped()
}
final class Presenter: Presentation {
var interactor: Usecase
func searchButtonTapped() {
self.interactor.fetch()
}
init(interactor: Usecase) {
self.interactor = interactor
}
}
// VIPERでのInteractorに当たる層
protocol Usecase {
func fetch()
}
final class ProductionUsecase: Usecase {
func fetch() {
print("fetch for Production")
}
}
final class MockUsecase: Usecase {
func fetch() {
print("fetch for Mock")
}
}
// VIPERでのViewに当たる層
let production = Presenter(interactor: ProductionUsecase())
production.searchButtonTapped() // "fetch for Production"
let test = Presenter(interactor: MockUsecase())
test.searchButtonTapped() // "fetch for Mock"