[์ค์ํํธ ๋์์ธํจํด] ์ต์ ๋ฒ ํจํด(Observer Pattern)
์ต์ ๋ฒ ํจํด (Observer Pattern)
์ค๋ ์ ๋ฆฌํ ๋์์ธ ํจํด์ ์ต์ ๋ฒ ํจํด์ ๋๋ค! ์ต์ ๋ฒ ํจํด์ ํ๋ ํจํด ์ค ํ๋๋ก ์ด๋ค ๊ฐ์ฒด์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ํด๋น ๊ฐ์ฒด๋ฅผ ๊ด์ฐฐํ๊ณ ์๋ ๊ฐ์ฒด์๊ฒ ์๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ด์๋๋ ํจํด์ ๋๋ค. ์๋ฆผ์ ์ฃผ์ฒด๊ฐ ๋๋ ๊ฐ์ฒด(Subject)๋ ์์ ์ ๊ด์ฐฐํ๋ ๊ฐ์ฒด(Observer)๋ค๊ณผ ์ผ๋๋ค ๊ด๊ณ๋ฅผ ๋งบ์ ์ ์์ต๋๋ค.
์ ์จ์ผํ ๊น?
์ต์ ๋ฒ ํจํด์ ๊ฐ๋ ฅํจ์ ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๋์จํ๊ฒ ์ฐ๊ฒฐ(Loose Coupling)๋๋ค๋ ์ ์ ์์ต๋๋ค. ๋์จํ๊ฒ ์ฐ๊ฒฐ๋๋ค๋ ๊ฒ์ ๋ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ค ์ฌ์ด์ ๊ฒฐํฉ๋๊ฐ ๋ฎ๋ค๋ ๊ฒ์ ์๋ฏธํ๊ณ , ์๋ก๊ฐ ์๋ก์ ๋ํ ์ต์ํ์ ์ ๋ณด๋ง์ ๊ฐ์ง๊ณ ์ํตํ๋ค๋ ๊ฒ์ ๋งํฉ๋๋ค.
๋ง๋ค์ด๋ณด๊ธฐ
๊ฐ์์ ์๋๋ฆฌ์ค๋ก ์ฐ์์ธ๊ณผ ๊ทธ ์ฐ์์ธ์ ํ๋ก์ฐํ๋ ์ฌ๋๋ค์ด ์๋ค๊ณ ํ๊ณ , ์ฐ์์ธ์ด ์๋ก์ด ๊ธ์ ์ฌ๋ ธ์ ๋ ํ๋ก์๋ค์๊ฒ ์๋์ผ๋ก ์๋ฆผ์ด ์ ์ก๋๋ ์์คํ ์ ๋ง๋ ๋ค๊ณ ํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ์ฐ์์ธ๋ถํฐ ๋ง๋ค์ด์ฃผ๊ฒ ์ต๋๋ค. ์ฐ์์ธ์ ๊ด์ฐฐ์ ๋์์ด ๋๋ Subject์ ์ญํ ์ ํ๊ฒ ์ฃ ?
protocol Observable {
func notify (post: String)
func add(follower: Follower)
func remove(follower: Follower)
}
class Celebrity: Observable {
let name: String
var followers: [Follower] = []
init(name: String) {
self.name = name
}
func notify(post: String) {
for follower in followers {
follower.update(post: post)
}
}
func add(follower: Follower) {
self.followers.append(follower)
}
func remove(follower: Follower) {
guard let removeIndex = followers.firstIndex(where: { $0 === follower }) else { return }
self.followers.remove(at: removeIndex)
}
}
์ฐ์์ธ ํด๋์ค๋ Observable ํ๋กํ ์ฝ์ ์ฑํํ๊ณ , ๋ด๋ถ์ ์์ ์ ํ๋ก์ฐ ํ๋ ์ฌ๋๋ค์ ๋ชฉ๋ก์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ์ต์ ๋ฒ ํจํด์ Subject๊ฐ ๋ฐ๋์ ํด์ผํ๋ ์ธ ๊ฐ์ง ์ญํ ์ด ์๋๋ฐ์, ๊ด์ฐฐ์ ๋ฑ๋ก, ๊ด์ฐฐ์ ์ ๊ฑฐ, ์๋ฆผ ์ ๋ฌ ์ ๋๋ค. ์ด ์์ ์์๋ ์์๋๋ก add, remove, notify ๋ฉ์๋๋ฅผ Observable ํ๋กํ ์ฝ์ ์ ์ธํ๊ณ , ์ด๋ฅผ ์ฑํํ ์ฐ์์ธ ํด๋์ค์์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋๋ก ํ์ต๋๋ค.
์ด์ ์ฐ์๋ค์ ํ๋ก์ฐํ๋ ์ ์ ๋ฅผ ํํํ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
protocol Followable {
func update (post: String)
}
class Follower: Followable {
let name: String
init(name: String) {
self.name = name
}
func update(post: String) {
print("\(name)์
๋๋ค! -> \(post)")
}
}
Followable ํ๋กํ ์ฝ์ ๊ด์ฐฐํ๋ ๋์์ธ Subject๊ฐ ๊ด์ฐฐ์๋ค์๊ฒ ์๋ฆผ์ ๋ณด๋ผ ๋ ์ด๋ค ๊ฒฝ๋ก๋ก ๋ณด๋ผ ๊ฒ์ธ์ง๋ฅผ ์ ์ํ ์ง๋ฅผ ๊ฒฐ์ ํ๊ณ ์์ด์ผํฉ๋๋ค. ์ด ์์ ์์๋ Subject๋ก๋ถํฐ ๋ฌธ์์ด์ ๋ฐ์ ์ฒ๋ฆฌํ๋๋ก update ๋ฉ์๋๊ฐ ์ ์ธ๋์ด ์๊ณ ์์ ์ ์ด๋ฆ์ ๋ฐ์ ์๋ฆผ์ ํจ๊ป ์ถ๋ ฅํ๋๋ก ์ ์๋์ด ์์ต๋๋ค.
์ฐ์์ธ ํด๋์ค์๋ ์๋ก์ด ํ๋ก์๋ฅผ ๋ฑ๋กํ ์ ์๋ ๋ฉ์๋๊ฐ ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ํ๋ก์๋ค์ ์ถ๊ฐํด์ค ์ ์์ต๋๋ค.
let han = Celebrity(name: "ํํธ์ด")
han.add(follower: Follower(name: "์์คํธ"))
han.add(follower: Follower(name: "ํฉ์ฅ์"))
han.add(follower: Follower(name: "์กฐ์๋ด"))
๊ทธ๋ฆฌ๊ณ ์ฐ์์ธ์ด ๊ฒ์๊ธ์ ํ๋ ์ ๋ฐ์ดํธ ํ๋ฉด, ๋ชจ๋ ํ๋ก์๋ค์ด ์๋ฆผ์ ๋ฐ๊ฒ๋ฉ๋๋ค.
han.notify(post: "ํธ๋์ด ์ด์ , ํธ์ด์ด์์~")
// ์์คํธ์
๋๋ค! -> ํธ๋์ด ์ด์ , ํธ์ด์ด์์~
// ํฉ์ฅ์์
๋๋ค! -> ํธ๋์ด ์ด์ , ํธ์ด์ด์์~
// ์กฐ์๋ด์
๋๋ค! -> ํธ๋์ด ์ด์ , ํธ์ด์ด์์~
์ ์ข์์ง ์ ๋ชจ๋ฅด๊ฒ ์ด์..
์ ์์ ์์ ์ฐ์์ธ์ด ํ๋ช ๋ง ์ถ๊ฐ๋์ด๋ ์ต์ ๋ฒ ํจํด์ ์ ์ฉํจ์ ๋๋ ์ ์์ต๋๋ค.
let park = Celebrity(name: "๋ฐ๋ฒ๊ตฌ")
let han = Celebrity(name: "ํํธ์ด")
let ahn = Follower(name: "์์คํธ")
han.add(follower: ahn)
han.add(follower: Follower(name: "ํฉ์ฅ์"))
han.add(follower: Follower(name: "์กฐ์๋ด"))
han.notify(post: "ํธ๋์ด ์ด์ , ํธ์ด์ด์์~")
park.add(follower: ahn)
park.notify(post: "DP ๋ณต๊ท ์ํ๋?")
// ์์คํธ์
๋๋ค! -> ํธ๋์ด ์ด์ , ํธ์ด์ด์์~
// ํฉ์ฅ์์
๋๋ค! -> ํธ๋์ด ์ด์ , ํธ์ด์ด์์~
// ์กฐ์๋ด์
๋๋ค! -> ํธ๋์ด ์ด์ , ํธ์ด์ด์์~
// ์์คํธ์
๋๋ค! -> DP ๋ณต๊ท ์ํ๋?
์๋ก์ด Subject๊ฐ ์ถ๊ฐ๋์์ง๋ง, Follower ๊ฐ์ฒด์๋ ์ ํ ๋ณ๊ฒฝ์ฌํญ์ด ์์ต๋๋ค. ๊ฐ์ฒด๋ค ์ฌ์ด์ ์์กด์ฑ์ด ๋ฎ์์ง๊ณ ๋์จํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ด์ฃ . ๋ํ ์ต์ ๋ฒ ํจํด์ ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น ์ค ๋จ์ผ ์ฑ ์ ์์น๊ณผ ๊ฐ๋ฐฉ ํ์ ์์น์ ์งํฌ ์ ์๋๋ก ๋์์ค๋๋ค. ์ด๋ค ๊ฐ์ฒด๋ฅผ ํ๋ก์ฐ ํ๋ ๊ฒ์ ๋ชจ๋ Followable ํ๋กํ ์ฝ์ ์ฑํํ๋ ๊ฐ์ฒด์๊ฒ ๋งก๊ฒจ์ ธ ์๊ณ , ์ด ํ๋ก์๋ค์ ๊ด๋ฆฌํ๋ ์ฑ ์์ ๋ชจ๋ Observable ๊ฐ์ฒด์๊ฒ ๋งก๊ฒจ์ ธ ์์ต๋๋ค. ๋ํ, Subject์๋ ๋ค๋ฅธ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ Follower ๊ฐ์ฒด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
'๐ฎ ์จ-์์ค > ๐ ๋์์ธํจํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote