GoF์ ๋์์ธ ํจํด, ๋ฐ๋ณต์ ํจํด์ ๋ํด ์์๋ณธ๋ค.
ํด๋น ๊ธ์, ๋ค์์ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ดํดํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค.
ํต์ฌ ์์ฝ
- ๋์ผํ ํจํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ํํ๊ธฐ ์ํ ํจํด
- ์ฆ, Container/Aggregator ๋ผ ๋ถ๋ฆฌ๋ ์๋ฃ๊ตฌ์กฐ์ ๋ํด ์ํ
- Array, Linked List, Tree, Graph, Table(DBMS)
- ๊ฐ ์๋ฃ๊ตฌ์กฐ๋ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง (๊ตฌํ ๋ฐฉ์์ด ๋ค๋ฅด๋)
- ์ด๋ฅผ ํ๋์ ํจํด์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํ ๊ฒ
์์
Code
main
import Foundation
internal func main() {
let items = [
Item(name: "Bitcoin", cost: 23000),
Item(name: "Tesla", cost: 170),
Item(name: "Jordan", cost: 200),
Item(name: "CyberTruck", cost: 50000)
]
let array = Array(items: items)
let iterator = array.iterator
while iterator.next {
guard let current = iterator.current as? Item else {
break
}
print(current.description)
}
}
main()
Object
import Foundation
internal protocol Object {
}
Aggregator
import Foundation
internal protocol Aggregator {
var iterator: Iterator { get }
}
Iterator
import Foundation
internal protocol Iterator {
var next: Bool { get }
var current: Object? { get }
}
Loggable
import Foundation
internal protocol Loggable {
var description: String { get }
}
Item
import Foundation
internal class Item: Object {
internal init(name: String, cost: Int) {
self.name = name
self.cost = cost
}
private let name: String
private let cost: Int
}
Array
import Foundation
internal class Array: Aggregator, Object {
internal init(items: [Item]) {
self.items = items
}
internal var iterator: Iterator {
ArrayIterator(array: self)
}
internal var count: Int {
self.items.count
}
internal func item(at index: Int) -> Item? {
guard index < self.items.count else {
return nil
}
return self.items[index]
}
private var items = [Item]()
}
ArrayIterator
import Foundation
internal class ArrayIterator: Iterator {
internal var next: Bool {
self.index += 1
return self.index < self.array.count
}
internal var current: Object? {
self.array.item(at: self.index)
}
internal init(array: Array) {
self.array = array
self.index = -1
}
private var array: Array
private var index: Int
}
ํ์ฉ์ฑ
- ๊ฐ์ฒด ๋ด๋ถ ํํ ๋ฐฉ์์ ๋ชจ๋ฅด๊ณ ๋ ์งํฉ ๊ฐ์ฒด์ ๊ฐ ์์๋ค์ ์ ๊ทผํ๊ณ ์ถ์ ๋
- ์งํฉ ๊ฐ์ฒด๋ฅผ ์ํํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ง์ํ๊ณ ์ถ์ ๋
- ์๋ก ๋ค๋ฅธ ์งํฉ ๊ฐ์ฒด ๊ตฌ์กฐ์ ๋ํด์๋ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ์ํํ๊ณ ์ถ์ ๋
๊ฒฐ๊ณผ
- ์งํฉ ๊ฐ์ฒด์ ๋ค์ํ ์ํ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
- ๋ค์ํ Iterator๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค.
- Aggregater์ ์ธํฐํ์ด์ค๋ฅผ ๋จ์ํํ ์ ์๋ค.
์๊ฐํด๋ณผ ์
- ๋ฐฐ์ด, ๋งํฌ๋๋ฆฌ์คํธ, ํธ๋ฆฌ๋ค๊ณผ ๊ฐ์ ๋ค์ํ ํํ์ ์ปจํ ์ด๋์ ๋ํด
- ํ์คํ๋ ๊ณตํต API๋ฅผ ์ ๊ณตํ ์ ์๋ค๋ ์ ์ด ํต์ฌ
- ํ๊ฐ์ API๋ง์ผ๋ก๋ ๋ค์ํ ํํ์ ์ปจํ ์ด๋ ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.