[Design Pattern] ์ต์ ๋ฒ ํจํด(Observer Pattern) ์ด์ผ๊ธฐ #1 (์์ ํฌํจ)
์ต์ ๋ฒ ํจํด(Observer Pattern)
์ต์ ๋ฒ ํจํด์ ๊ด์ฐฐ์ ํจํด์ด๋ผ๊ณ ๋ ํฉ๋๋ค. ์ผ๋๋ค ๊ด๊ณ๋ฅผ ์ด๋ฃจ๊ณ ์์ผ๋ฉฐ, ์ํ๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด ๋ชจ๋ ์ต์ ๋ฒ๋ค์๊ฒ ์ ๋ณด๋ฅผ ๊ฐฑ์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ข ๋ ์ดํดํ๊ธฐ ์ฌ์ด ์์๋ฅผ ๋ค์ด๋ณผ๊น์? (์์ ์ฝ๋๋ ๋ณธ๋ฌธ ํ๋จ์ ์ฒจ๋ถ๋์ด ์์ต๋๋ค.)
์์ 1. ์ ํ๋ธ ๊ตฌ๋ ์๋
์ฒ ์(Observer)๊ฐ ์ฝ๋ฉ ๊ณต๋ถ๋ฅผ ์ํด ์ ํ๋ธ์์ ํ๋ก๊ทธ๋๋ฐ ๊ด๋ จ ์์์ ์ฐพ๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ Luckygg(Subject)๋ผ๋ ์ฌ๋์ ์ฑ๋์ ์ข์ ์์๋ค์ด ์๋ ๊ฒ์ ์๊ฒ ๋์ต๋๋ค. ํ๋ ๋ ๊ฐ์ ๋ ์์๋ค์ ๋ณด๊ฒ ๋๋ค๊ฐ ์ด๋์ ๋ชจ๋ ์์๋ค์ ๋ณด๊ฒ ๋์ต๋๋ค. ์ด์ ์๋ก์ด ์์์ด ์ ๋ฐ์ดํธ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด ์์์ด ์ธ์ ์ฌ๋ผ์ฌ ์ค ์๊ณ ๋ง๋ฅ ๊ธฐ๋ค๋ฆด๊น์? ์ด๋, ์ฑ๋ ๊ตฌ๋ (Register)์ ํ์ฌ ์ ๋ฐ์ดํธ ์๋ฆผ(Notify)์ ๋ฐ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ ํ๋ธ ์ฑ๋ ๊ด๋ฆฌ์๊ฐ ์์์ ์ ๋ฐ์ดํธํ๋ฉด, ๊ตฌ๋ ํ๊ณ ์๋ ๋ชจ๋ ์ฌ์ฉ์๋ค์๊ฒ ์๋ฆผ์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
์์ 2. ์ ๋ฌธ์ฌ ๊ตฌ๋
์์ฆ์๋ ์ข ์ด ์ ๋ฌธ์ ๋ณด๋ ์ฌ๋์ด ๊ฑฐ์ ์์ ๊ฒ์ ๋๋ค. ๊ฑฐ์ ๋ชจ๋ ์ ๋ฌธ์ฌ๋ค์ด ์ธํฐ๋ท์ผ๋ก๋ ์ ๊ณต์ ํ๊ณ , ๋ฌด๋ฃ์ด๋ฉฐ ์ธ์ ์ด๋์๋ ์ค๋งํธํฐ์ผ๋ก ๋ด์ค๋ฅผ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ . ํ์ง๋ง ์ง๊ธ์ฒ๋ผ ์ค๋งํธํฐ์ด ๋ณด๊ธ๋๊ธฐ ์ ์๋ ์ข ์ด ์ ๋ฌธ์ ์ด๋ป๊ฒ ๊ตฌ๋ ํ์๊น์? ์ฌ์ฉ์(Observer)๊ฐ ์ ๋ฌธ์ฌ(Subject)์ ์ ๋ฌธ ๊ตฌ๋ ์ ์ ์ฒญ(Register)ํ๋ฉด, ์ ๋ฌธ์ฌ์์๋ ํด๋น ์ง์ ์ ๋ฌธ์ ๋ฐฐ๋ฌํ๋๋ก ์ฃผ์๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์๋ ์๋ฒฝ์ ์ ๋ฌธ ๋ฐฐ๋ฌ๋ถ๊ฐ ๊ตฌ๋ ์ ๋ชฉ๋ก์ ์๋ ๋ชจ๋ ์ง์ ์ ๋ฌธ์ ๋ฐฐ๋ฌ(Notify)ํ๊ฒ ๋์ฃ . ๊ทธ๋ฐ๋ฐ ํ ๋ฌ ๋ค, ํ ๊ณ ๊ฐ์ด ์ ๋ฌธ์ ์ํ์ง ์์ ๊ตฌ๋ ์ ํด์ง(Remove)ํ์ต๋๋ค. ๊ทธ๋ผ ์ด ๊ณ ๊ฐ์ ์ ๋ฌธ์ฌ์ ๊ตฌ๋ ์ ๋ชฉ๋ก์์ ์ ์ธ๋๊ฒ ์ฃ . ๋ค์๋ ์ ๋ฌธ ๋ฐฐ๋ฌ๋ถ๊ฐ ๊ฐ๊ณ ์๋ ๋ชฉ๋ก์๋ ์ด ๊ณ ๊ฐ์ ์ฃผ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐฐ๋ฌํ์ง ์๊ฒ ๋ฉ๋๋ค.
๋ ์์์ ๋ค์ด์ด๊ทธ๋จ์ ๋ณด๋ฉด ๊ตฌ์กฐ๊ฐ ๋์ผํฉ๋๋ค. ์์ฃผ ์ ํ์ ์ด๊ณ ๊ธฐ๋ณธ์ ์ธ ์ต์ ๋ฒ ํจํด์ ์์์ ๋๋ค. ์ด๋ ๊ฒ ํน์ ์ ๋ณด๋ฅผ ์ฌ๋ฌ ๋ทฐ์์ ๋์์ ์ป๊ธฐ ์ํด ์ฃผ์ ์(Subject)์ ๊ตฌ๋ ์(Observer)๋ฅผ ๋ฑ๋ก(Register)ํ์ฌ ์ ๋ณด๋ฅผ ๋ฐ๋(๊ฐฑ์ , Notify) ๊ฒ์ ์ต์ ๋ฒ ํจํด(Observer pattern)์ด๋ผ๊ณ ํฉ๋๋ค. ๋ฌผ๋ก ๋ฑ๋ก์ ํ์ผ๋ ํด์ง(Remove)๋ ๊ฐ๋ฅํฉ๋๋ค.
์ ์ ๋ฐ ๊ตฌ์กฐ
Head First Design Pattern์์๋ ์ต์ ๋ฒ ํจํด์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ ์ํฉ๋๋ค.
ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ฐ๋๋ฉด ๊ทธ ๊ฐ์ฒด์ ์์กดํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์๊ฒ ์ ๋ณด๊ฐ ์๋์ผ๋ก ๊ฐฑ์ ๋๋ ๋ฐฉ์์ผ๋ก, ์ผ๋๋ค(one-to-many) ์์กด์ฑ์ ์ ์ํฉ๋๋ค.
์ต์ ๋ฒ ํจํด์์ ์ฃผ์ ์๋ ์ต์ ๋ฒ์ ๋ํ ์ ๋ณด๊ฐ ์์ต๋๋ค. ์ค์ง ์ต์ ๋ฒ๊ฐ ํน์ ์ธํฐํ์ด์ค(Interface)๋ฅผ ๊ตฌํํ๋ค๋ ๊ฒ ๋ง ์๊ณ ์์ต๋๋ค. ์ฆ, ์ต์ ๋ฒ๊ฐ ๋ฌด์จ ๋์์ ํ๋์ง ๋ชจ๋ฅธ๋ค๋ ๊ฒ์ ๋๋ค. ๊ฒ๋ค๊ฐ ์ต์ ๋ฒ๋ ์ธ์ ๋ ์ง ์๋ก ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ์ ์์ผ๋ฉฐ ์๋ก์ด ํ์์ ์ต์ ๋ฒ๋ฅผ ์ถ๊ฐํ ๋์๋ ์ฃผ์ ์ ์ ํ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. ์ด๋ฌํ ๊ด๊ณ๋ฅผ ๋์จํ ๊ฒฐํฉ(Loose coupling)์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋ป๊ฒ ์ด๋ฐ ํน์ง์ด ์์๊น์? ์๋ UML์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. Subject interface๋ ๋ฑ๋ก, ํด์ , ๊ฐฑ์ ์ ์ํ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์์๋ฐ๋ concrete Subject Class๋ ๋ฑ๋ก, ํด์ , ๊ฐฑ์ ์ ๊ตฌํํ๊ณ ๊ธฐํ ํจ์๋ ๊ตฌํํ ์ ์์ต๋๋ค. Observer interface๋ Subject์์ ๊ฐฑ์ ํ ๋ ํธ์ถ๋๋ update API๋ง ์ ๊ณตํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก Observer interface๋ฅผ ์์๋ฐ๋ A, B, C Class์ update๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด๊ฒ์ด ์ต์ ๋ฒ ํจํด์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ ๋๋ค.
์ฝ๋ ์์
๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฝ๋๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ ๋ณด์ฌ๋๋ฆด ์์๋ Concrete Subject class์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋ฑ๋ก๋ ๋ชจ๋ Observer๋ค์๊ฒ ๊ฐฑ์ ํ๋ ๊ฐ๋จํ ๊ตฌ์กฐ์ ๋๋ค.
Subject interface์ ๋๋ค. Observer๋ฅผ ๋ฑ๋ก, ํด์ , ๊ฐฑ์ ํ๊ธฐ ์ํ API๋ฅผ ๋ํ๋ ๋๋ค.
public interface Subject
{
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
Observer interface์ ๋๋ค. update ํจ์์ ์ธ์๋ก value๊ฐ ๋์ด์ต๋๋ค.
public interface Observer
{
void update(int value);
}
ConcreteSubject๋ Subject interface๋ฅผ ์์๋ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ArrayList๋ฅผ ์ฌ์ฉํ์ฌ observer ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
public class ConcreteSubject : Subject
{
IList _observers = new ArrayList();
int _value;
public ConcreteSubject()
{
_value = 0;
}
public void notifyObservers()
{
foreach (Observer o in _observers)
o.update(_value);
}
public void registerObserver(Observer o)
{
_observers.Add(o);
}
public void removeObserver(Observer o)
{
_observers.Remove(o);
}
public void setValue(int value)
{
_value = value;
notifyObservers();
}
}
์๋๋ ๊ฐ Observer interface๋ฅผ ์์๋ฐ๋ A, B, C class์ ๋๋ค. ๋๊ฐ์ ํด๋์ค๊ฐ ์ค๋ณต๋ ๊ฒ์ ๋๋ค. ๊ฐ ํด๋์ค ์์ฑ์์์ ConcreteSubject๋ฅผ ์ธ์๋ก ๋ฐ๊ณ , registerObserver๋ฅผ ํธ์ถํ์ฌ ์์ ์ ์ต์ ๋ฒ๋ก์ ๋ฑ๋กํฉ๋๋ค.
public class A : Observer
{
ConcreteSubject _subject;
public A(ConcreteSubject subject)
{
_subject = subject;
subject.registerObserver(this);
}
public void update(int value)
{
Console.WriteLine(String.Format("A Class update, value: {0}", value));
}
}
public class B : Observer
{
ConcreteSubject _subject;
public B(ConcreteSubject subject)
{
_subject = subject;
subject.registerObserver(this);
}
public void update(int value)
{
Console.WriteLine(String.Format("B Class update, value: {0}", value));
}
}
public class C : Observer
{
ConcreteSubject _subject;
public C(ConcreteSubject subject)
{
_subject = subject;
subject.registerObserver(this);
}
public void update(int value)
{
Console.WriteLine(String.Format("C Class update, value: {0}", value));
}
}
์ด์ ๋ฉ์ธ ํ๋ก๊ทธ๋จ ์ ๋๋ค. ConcreteSubject ๋ฐ A, B, C ์ธ์คํด์ค๋ฅผ ์์ฑํ๋๋ฐ A, B, C ๊ฐ ์ธ์คํด์ค๊ฐ ์ต์ ๋ฒ๋ก์ ConcreteSubject ์ธ์คํด์ค์ ๋ฑ๋ก๋ฉ๋๋ค. ๋ง์ง๋ง ์ค์ธ setValue(10)์ ํธ์ถํ๋ฉด ๋ชจ๋ ์ต์ ๋ฒ์ update๊ฐ ํธ์ถ๋ฉ๋๋ค.
class Program
{
static void Main(string[] args)
{
ConcreteSubject concreteSubject = new ConcreteSubject();
A observerA = new A(concreteSubject);
B observerB = new B(concreteSubject);
C observerC = new C(concreteSubject);
concreteSubject.setValue(10);
}
}
๊ฒฐ๊ณผ ํ๋ฉด์ ์๋์ ๊ฐ์ต๋๋ค.
์ฌ๊ธฐ๊น์ง ์ค๋ช ํ ๋ด์ฉ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ต์ ๋ฒ ํจํด์ ๋์์ ๋๋ค. ConcreteSubject์์ ๊ฐ์ ์ค์ ํด์ผ ๋ชจ๋ ์ต์ ๋ฒ๋ ๊ฐฑ์ ๋ง ํ๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ฅผ ์์ฉํ๋ฉด ๊ฐ ์ต์ ๋ฒ์์๋ ๊ฐ์ ์ค์ ํ์ฌ ๋ชจ๋ ์ต์ ๋ฒ์ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ๋ ๊ตฌํํ ์ ์์ต๋๋ค. ์ต์ ๋ฒ ํจํด์ ๋ง์ด ์ฌ์ฉ๋๊ณ MVC ํจํด์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ์ด ๊ฐ๋ ์ด๋ ๊ผญ ์ตํ๋์๊ธธ ๊ถ์ฅํฉ๋๋ค.
'Programming > Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Design Pattern] ๋์์ธ ํจํด ์๊ฐ (์ถ์ฒ ๋์ ํฌํจ)
[Design Pattern] ๋์์ธ ํจํด ์๊ฐ (์ถ์ฒ ๋์ ํฌํจ)
2019.10.06 -
[Design Pattern] MVC(Model-View-Controller) ํจํด ์ด์ผ๊ธฐ #2 (์์ ํฌํจ)
[Design Pattern] MVC(Model-View-Controller) ํจํด ์ด์ผ๊ธฐ #2 (์์ ํฌํจ)
2019.10.01 -
[Design Pattern] MVC(Model-View-Controller) ํจํด ์ด์ผ๊ธฐ #1
[Design Pattern] MVC(Model-View-Controller) ํจํด ์ด์ผ๊ธฐ #1
2019.09.27 -
[Design Pattern] ์ต์ ๋ฒ ํจํด(Observer Pattern) ์ด์ผ๊ธฐ #2 (์์ ํฌํจ)
[Design Pattern] ์ต์ ๋ฒ ํจํด(Observer Pattern) ์ด์ผ๊ธฐ #2 (์์ ํฌํจ)
2019.09.23