[Design Pattern] ์ต์ ๋ฒ ํจํด(Observer Pattern) ์ด์ผ๊ธฐ #2 (์์ ํฌํจ)
์ง๋ ํฌ์คํ
์์ ์ต์ ๋ฒ ํจํด(Observer Pattern)์ ๋ํด ์ค๋ช
ํ์์ต๋๋ค.
[Design Pattern] ์ต์ ๋ฒ ํจํด(Observer Pattern) ์ด์ผ๊ธฐ (์์ ํฌํจ)
๊ฐ๋จํ ์ ๋ฆฌํ๋ฉด, ์ฃผ์ ์(Subject)์ ๊ตฌ๋ ์(Observer)๊ฐ ๋ฑ๋ก(Register)๋์ด ๋ชจ๋ ๊ตฌ๋ ์๊ฐ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธ(Notify)๋ฐ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฃผ ์ฌ์ด ์ฝ์ ๊ธฐ๋ฐ์ ์์ ์ฝ๋๋ฅผ ์๊ฐํ์๋๋ฐ์. ์ด๋ฒ ํฌ์คํ ์์๋ ์ข ๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ์น์ํ ์ํผ(WinForm) ๊ธฐ๋ฐ์ ์ํ ์ฝ๋๋ฅผ ์๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
WinForm ๊ธฐ๋ฐ์ Observer Pattern ์์
์๊ฐํด๋๋ฆด ์์ ์ฝ๋์ ๊ตฌ์กฐ๋ ์๋ UML๊ณผ ๊ฐ์ต๋๋ค. Subject interface๋ฅผ MainForm class๊ฐ ์์๋ฐ์ ํจ์๋ฅผ ๊ตฌํํ๊ณ , Observer interface๋ฅผ SubForm class๊ฐ ์์๋ฐ์ ํจ์๋ฅผ ๊ตฌํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ MainForm์ Textbox์ ์ซ์๋ฅผ ์ ๋ ฅํ๊ณ Enterํค๋ฅผ ๋๋ฅด๋ฉด, ์ด ์ซ์๊ฐ ๋ชจ๋ SubForm์ ๊ฐฑ์ ํ๋๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
์ต์ ๋ฒ ํจํด์ ๋์ผํ ์ ๋ณด๋ฅผ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๋ ๋ ์ ์ฉํ ๋ฐฉ๋ฒ๋ก ์ ๋๋ค. ์ง๋ ํฌ์คํ ์์๋ YouTube๋ ์ ๋ฌธ์ฌ์ ๊ฐ์ ์์๋ฅผ ๋ค์๋๋ฐ์. ์ด๋ฒ์๋ ๋น์ ํ๋ก๊ทธ๋๋ฐ๊ณผ ์ฐ๊ด ์ง์ด ์์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์นด๋ฉ๋ผ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ๋ฌ Form์์ ์ ๊ทผํด์ผ ํ ๋ ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํ๋ฉด, ๋ชจ๋ Form์์ ํญ์ ํ์ฌ ๊ฐ์ ์ ๋ฐ์ดํธ๋ฐ์ ์ ์์ต๋๋ค. ๋ง์ฝ, ์ด๋ฌํ ๋์์ธ ํจํด์ ์ ์ฉํ์ง ์๋๋ค๋ฉด ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํญ์ ํ์ธํ๋๋ก ๊ตฌํํด์ผ๊ฒ ์ฃ ? (์ฌ์ค ์ ์์๋ MVC ํจํด์ด ๋ ์ ํฉํ๊ธด ํฉ๋๋ค. MVC ํจํด์ ์ถํ์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค.)
์๋ ๊ทธ๋ฆผ์ ์์ ์ฝ๋๋ฅผ ๋์์ํจ ๊ฒฐ๊ณผ์ ๋๋ค.
์ฝ๋ ์ค๋ช
Subject์ Observer interface๋ ์๋์ ๊ฐ์ด ์ ์๋์ด ์์ต๋๋ค.
public interface Subject
{
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
public interface Observer
{
void update(int value);
}
Observer interface๋ฅผ ์์๋ฐ๋ SubForm1, 2๋ ์๋์ ๊ฐ์ด ๊ตฌํ๋์ด ์์ต๋๋ค. ์์ฑ์์์ Subject์ registerObserver๋ฅผ ํธ์ถํ์ฌ ์๊ธฐ ์์ ์ ๋ฑ๋กํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ update๊ฐ ํธ์ถ๋๋ฉด TextBox์ ์ธ์๋ก ๋ฐ์ ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
public partial class SubForm1 : Form, Observer
{
Subject _subject;
public SubForm1(Subject subject)
{
_subject = subject;
subject.registerObserver(this);
InitializeComponent();
}
public SubForm1()
{
InitializeComponent();
}
public void update(int value)
{
textBoxValue.Text = value.ToString();
}
}
๋ง์ง๋ง์ผ๋ก Subject interface๋ฅผ ์์๋ฐ์ MainForm์๋ ์๋์ ๊ฐ์ด ๊ตฌํํฉ๋๋ค. ์ต์ ๋ฒ ๋ชฉ๋ก์ ArrayList๋ก ๊ด๋ฆฌํ๋ฉฐ, Subject interface์ ์ ์๋ ํจ์๋ค์ ๊ตฌํํฉ๋๋ค. ๋ํ, TextBox์ KeyDown ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ์ ๋ฐ์ ๋ชจ๋ ์ต์ ๋ฒ๋ค์๊ฒ ์๋ ค์ค๋๋ค.
public partial class MainForm : Form, Subject
{
SubForm1 _subForm1 = null;
SubForm2 _subForm2 = null;
IList _observers = new ArrayList();
public MainForm()
{
InitializeComponent();
_subForm1 = new SubForm1(this);
_subForm1.TopLevel = false;
_subForm1.FormBorderStyle = FormBorderStyle.None;
_subForm1.Dock = DockStyle.Fill;
panelTab1.Controls.Add(_subForm1);
_subForm1.Show();
_subForm2 = new SubForm2(this);
_subForm2.TopLevel = false;
_subForm2.FormBorderStyle = FormBorderStyle.None;
_subForm2.Dock = DockStyle.Fill;
panelTab2.Controls.Add(_subForm2);
_subForm2.Show();
}
public void notifyObservers()
{
foreach (Observer o in _observers)
o.update(Convert.ToInt32(textBoxValue.Text));
}
public void registerObserver(Observer o)
{
_observers.Add(o);
}
public void removeObserver(Observer o)
{
_observers.Remove(o);
}
private void TextBoxValue_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Enter)
{
int value = Convert.ToInt32(textBoxValue.Text);
notifyObservers();
}
}
}
์์ธํ ๋ด์ฉ์ ์๋ ์ฒจ๋ถ๋ ์์ ์ฝ๋๋ฅผ ํ์ธํด์ฃผ์ธ์.
'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) ์ด์ผ๊ธฐ #1 (์์ ํฌํจ)
[Design Pattern] ์ต์ ๋ฒ ํจํด(Observer Pattern) ์ด์ผ๊ธฐ #1 (์์ ํฌํจ)
2019.09.12