Bridge
デザインパターンとは
デザインパターンとはオブジェクト思考開発における先人たちが作り上げてきた便利な設計図です。
Gang of Four通称Gofが1994年に出版した『オブジェクト指向における再利用のためのデザインパターン』の中で23個の設計図が紹介されています。
Note
デザインパターンのサンプルコードはSwift4でまとめます。
ブリッジパターンとは?
ブリッジパターンはクラスの橋渡しを担うパターンです。ブリッジパターンを利用することで、機能と実装を分離することができます。
また継承を使わずに機能追加できることも利点の一つです。
サンプルコード
サンプルコードでは虫の生活について考えてコードを書いてみました。
虫の生活(処理クラス)
食べる、飛ぶ、寝るの各クラスがInsectLifeに準拠しています。
protocol InsectLife {
func doSomething()
}
class Eat: InsectLife {
func doSomething() {
print("エサを食べる!")
}
}
class Fly: InsectLife {
func doSomething() {
print("空を飛ぶ!")
}
}
class Sleep: InsectLife{
func doSomething() {
print("寝るzzZ")
}
}
虫(実装クラス)
てんとう虫とバッタを作るクラスを作成しています。それぞれがInsectに準拠しています。
このパターンで大切なのはInsectです。メンバ変数のimplがInsectLifeを保持することで処理クラスとの橋渡し(Bridge)になっています
本来のデザインパターンではInsectをクラスとして作成することが多いかと思いますが、Swiftらしくプロトコルで作りました。
protocol Insect {
var impl: InsectLife? { get }
}
extension Insect {
func execute(){
impl?.doSomething()
}
}
class Ladybird: Insect {
var impl: InsectLife?
var name = "てんとう虫"
}
class Grasshopper: Insect {
var impl: InsectLife?
var name = "バッタ"
}
呼び出し元
それぞれのimplに行いたい処理のクラスを入れることで、柔軟に実装を行うことができます。
let ladybird = Ladybird()
print(ladybird.name)
ladybird.impl = Eat()
ladybird.execute()
ladybird.impl = Fly()
ladybird.execute()
let grasshopper = Grasshopper()
print(grasshopper.name)
grasshopper.impl = Fly()
grasshopper.execute()
grasshopper.impl = Sleep()
grasshopper.execute()
コンソールログ
てんとう虫
エサを食べる!
空を飛ぶ!
バッタ
空を飛ぶ!
寝るzzZ
コード一覧
import UIKit
protocol InsectLife {
func doSomething()
}
class Eat: InsectLife {
func doSomething() {
print("エサを食べる!")
}
}
class Fly: InsectLife {
func doSomething() {
print("空を飛ぶ!")
}
}
class Sleep: InsectLife{
func doSomething() {
print("寝るzzZ")
}
}
protocol Insect {
var impl: InsectLife? { get }
}
extension Insect {
func execute(){
impl?.doSomething()
}
}
class Ladybird: Insect {
var impl: InsectLife?
var name = "てんとう虫"
}
class Grasshopper: Insect {
var impl: InsectLife?
var name = "バッタ"
}
let ladybird = Ladybird()
print(ladybird.name)
ladybird.impl = Eat()
ladybird.execute()
ladybird.impl = Fly()
ladybird.execute()
let grasshopper = Grasshopper()
print(grasshopper.name)
grasshopper.impl = Fly()
grasshopper.execute()
grasshopper.impl = Sleep()
grasshopper.execute()