โ๏ธ Java Design-Pattern Xโ ฆ - Mediator
โ๏ธ Java Design-Pattern Xโ
ฆ - Mediator
๐
ใJAVA ์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธ ํจํด : ์ฝ๊ฒ ๋ฐฐ์ฐ๋ GoF์ 23๊ฐ์ง ๋์์ธ ํจํดใ
๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Mediator
ํจํด์ด๋?
- ๊ฐ๋ น 10๋ช ์ด ๋ชจ์ฌ ๊ณต๋ ์์ ์ ํ๋๋ฐ ์ข์ฒ๋ผ ๋์ด ๋์ง ์๋๋ค.
- ๋ฉค๋ฒ๋ค์ด ์๋ก ์ง์ํ๋ฉฐ ์์ ์ ํผ๋์ ๊ฒช๊ณ ์๊ณ , ์๋ก์ ์์ ์ ์ผ์ผ์ด ์ฐธ๊ฒฌํด์ ๋ถ์์ด ์ผ์ด๋๊ณ ์๋ค.
- ์ด๋ ์ ์ฅ์ด ๋ค๋ฅธย ์ค์ฌ์๊ฐ ๋ฑ์ฅํด์ ๋ฉค๋ฒ๊ฐ ๋ชจ๋ ์ค์ฌ์์๊ฒ๋ง ๋ณด๊ณ ํ๊ณ , ์ค์ฌ์๋ง ๋ฉค๋ฒ์๊ฒ ์ง์๋ฅผ ๋ด๋ฆฌ๊ฒ ๋๋ค๊ณ ๊ฐ์ ํ์.
- ์ด๋ฌํ ํ๋ก์ธ์ค๋ฅผ ํจํดํํ ๊ฒ์ดย
Mediator
ย ํจํด์ด๋ค.
์์ ํ๋ก๊ทธ๋จ
- ๋ค์์ ์ด๋ฆ๊ณผ ํจ์ค์๋๋ฅผ ์
๋ ฅํ์ฌ ๋ก๊ทธ์ธํ๋ย
GUI
ย ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ค. - ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ค.
- ๊ฒ์คํธ ๋ก๊ทธ์ธ ๋๋ ์ฌ์ฉ์ ๋ก๊ทธ์ธ์ ์ฌ์ฉํ๋ค.
- ๊ฒ์คํธ ๋ก๊ทธ์ธ์ผ ๋๋ย
username
,ยpassword
๊ฐ ๋นํ์ฑํ ๋๋ค. - ์ฌ์ฉ์ ๋ก๊ทธ์ธ์ผ ๋๋งย
username
๊ณผยpassword
๋ฅผ ์ ๋ ฅํ๋ค. username
์ ๋ฌธ์๊ฐ ํ๋๋ ์์ผ๋ฉดยpassword
๋ ๋นํ์ฑํ ๋๋ค.- ๋ก๊ทธ์ธํ๋ ค๋ฉดย
OK
ย ๋ฒํผ, ๊ทธ๋ง๋๋ ค๋ฉดยCANCEL
ย ๋ฒํผ์ ํด๋ฆญํ๋ค. username
,ยpassword
ย ๋ชจ๋ ๋ฌธ์๊ฐ ํ๋๋ผ๋ ๋ค์ด๊ฐ ์์ผ๋ฉดยOK
ย ๋ฒํผ์ด ํ์ฑํ ๋๋ค.CANCEL
ย ๋ฒํผ์ ํญ์ ํ์ฑํ ๋์ด ์๋ค.
- ์๊ธฐ ๋ก์ง์ ๊ฐ ํด๋์ค์ ๋ถ์ฐ์ํค๋ฉด ์ฝ๋ฉ ๋ฐ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋งค์ฐ ํ๋ค์ด์ง๋ค.
- ๊ฐ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ก ์ฐ๊ด๋์ด ์์ด ์๋ก๊ฐ ์๋ก๋ฅผ ํต์ ํ๋ ์ํฉ์ ๋น ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
Mediator
ย ์ธํฐํ์ด์ค
1
2
3
4
public interface Mediator {
public abstract void createColleagues();
public abstract void colleagueChanged();
}
- ์ค์ฌ์๋ฅผ ๋ํ๋ด๋ ์ธํฐํ์ด์ค์ด๋ค.
createColleagues
ย ๋ฉ์๋๋ ์ค์ฌ์๊ฐ ๊ด๋ฆฌํ ๋ฉค๋ฒ๋ฅผ ์์ฑํ๋ค.colleagueChanged
ย ๋ฉ์๋๋ ๋ฉค๋ฒ๊ฐ ํธ์ถํ๋ ๋ฉ์๋์ด๋ค.- ์์ ํ๋ก๊ทธ๋จ์์๋ ๋ผ๋์ค ๋ฒํผ์ด๋ ํ ์คํธ ํ๋ ์ํ๊ฐ ๋ณํํ์ ๋ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
Colleague
ย ์ธํฐํ์ด์ค
1
2
3
4
public interface Colleague {
public abstract void setMediator(Mediator mediator);
public abstract void setColleagueEnabled(boolean enabled);
}
- ์ค์ฌ์์๊ฒ ์๋ด์ ์๋ขฐํ ๋ฉค๋ฒ๋ฅผ ๋ํ๋ด๋ ์ธํฐํ์ด์ค์ด๋ค.
setMediator
ย ๋ฉ์๋๋ ์ค์ฌ์๊ฐ ์์ ์ ์ค์ฌ์๋ก ๊ธฐ์ตํด๋ฌ๋ผ๋ ์๋ฏธ๋ก ํธ์ถํ๋ค.- ์ด ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ์ค์ฌ์๋ ์ถํ ์๋ด์ด ํ์ํ ๋ ์ฌ์ฉ๋๋ค.
setColleagueEnabled
ย ๋ฉ์๋๋ ์ค์ฌ์๋ก๋ถํฐ ๋ด๋ ค์ค๋ ์ง์์ ํด๋นํ๋ค.- ์ฆ ์ค์ฌ์๊ฐ ํธ์ถํ๋ ๋ฉ์๋์ด๋ค.
ColleagueButton
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.awt.Button;
public class ColleagueButton extends Button implements Colleague {
private Mediator mediator;
public ColleagueButton(String caption) {
super(caption);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnable(boolean enabled) {
setEnabled(enabled);
}
}
java.awt.Button
์ ํ์ ํด๋์ค๋กยColleague
ย ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌยLoginFrame
ย ํด๋์ค์ ํ์กฐํ๋ฉฐ ๋์ํ๋ค.
ColleagueTextField
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.awt.Color;
import java.awt.TextField;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
public class ColleagueTextField extends TextField implements TextListener, Colleague {
private Mediator mediator;
public ColleagueTextField(String text, int columns) {
super(text, columns);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnable(enabled);
setBackground(enabled ? Color.white : Color.lightGray);
}
@Override
public void textValueChanged(TextEvent e) {
mediator.colleagueChanged();
}
}
java.awt.TextField
์ ํ์ ํด๋์ค์ด๊ณ ยColleague
,ยjava.awt.event.TextListener
ย ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.texetValueChanged
ย ๋ฉ์๋๋ยTextListener
ย ์ธํฐํ์ด์ค๋ฅผ ์ํ ๋ฉ์๋๋ก, ํ ์คํธ ๋ด์ฉ์ ๋ณ๊ฒฝ์ด ์์ผ๋ฉดยAWT
ย ํ๋ ์์ํฌ์์ ํธ์ถ๋๋ค.- ์์ ํ๋ก๊ทธ๋จ์์ ํด๋น ๋ฉ์๋๋ ์ค์ฌ์์ย
colleagueChanged
ย ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์๋ค.
ColleagueCheckBox
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
private Mediator mediator;
public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) {
super(caption, group, state);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
}
@Override
public void itemStateChanged(ItemEvent e) {
mediator.colleagueChanged();
}
}
java.awt.Checkbox
ย ํด๋์ค์ ํ์ ํด๋์ค๋ค.- ์์ ํ๋ก๊ทธ๋จ์์๋ ์ฒดํฌ๋ฐ์ค๊ฐ ์๋ ๋ผ๋์ค ๋ฒํผ์ผ๋ก ์ฌ์ฉ๋๋ค.
- ์ด ํด๋์ค๋ ๋ผ๋์ค ๋ฒํผ์ ์ํ ๋ณํ๋ฅผย
itemStateChanged
ย ๋ฉ์๋๋ก ํ์ ํ๊ธฐ ์ํดยjava.awt.event.ItemListener
ย ์ธํฐํ์ด์ค๋ ๊ตฌํํ๋ค.
LoginFrame
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoginFrame extends Frame implements ActionListener, Mediator {
private ColleagueCheckbox checkGuest;
private ColleagueCheckbox checkLogin;
private ColleagueTextField textUser;
private ColleagueTextField textPass;
private ColleagueButton buttonOk;
private ColleagueButton buttonCancel;
public LoginFrame(String title) {
super(title);
setBackground(Color.lightGray);
setLayout(new GridLayout(4, 2));
createColleagues();
add(checkGuest);
add(checkLogin);
add(new Label("Username:"));
add(textUser);
add(new Label("Password:"));
add(textPass);
add(buttonOk);
add(buttonCancel);
colleagueChanged();
pack();
setVisible(true);
}
@Override
public void createColleagues() {
// checkbox
CheckboxGroup g = new CheckboxGroup();
checkGuest = new ColleagueCheckbox("Guest", g, true);
checkLogin = new ColleagueCheckbox("Login", g, false);
// textField
textUser = new ColleagueTextField("", 10);
textPass = new ColleagueTextField("", 10);
textPass.setEchoChar('*');
// button
buttonOk = new ColleagueButton("OK");
buttonCancel = new ColleagueButton("Cancel");
// mediator
checkGuest.setMediator(this);
checkLogin.setMediator(this);
textUser.setMediator(this);
textPass.setMediator(this);
buttonOk.setMediator(this);
buttonCancel.setMediator(this);
// listener
checkGuest.addItemListener(checkGuest);
checkLogin.addItemListener(checkLogin);
textUser.addTextListener(textUser);
textPass.addTextListener(testPass);
buttonOk.addActionListener(this);
buttonCancel.addActionListener(this);
}
@Override
public void colleagueChanged() {
if (checkGuest.getState()) {
textUser.setColleagueEnabled(false);
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(true);
} else {
textUser.setColleagueEnabled(true);
userPassChanged();
}
}
private void userPassChanged() {
if (textUser.getText().length() > 0) {
textPass.setColleagueEnabled(true);
if (textPass.getText().length() > 0) {
buttonOk.setColleagueEnabled(true);
} else {
buttonOk.setColleagueEnabled(false);
}
} else {
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(false);
}
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.toString());
System.exit(0);
}
}
- ์ค์ฌ์ ์ญํ ์ ํด๋นํ๋ค.ย
java.awt.Frame
์ ํ์ ํด๋์ค์ด๊ณ ยMediator
ย ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.- ์์ฑ์์์๋ ๋ฐฐ๊ฒฝ์ ์ค์ , ๋ ์ด์์ ์ค์ ,ย
colleague
ย ์์ฑ ๋ฐ ๋ฐฐ์น, ์ด๊ธฐ ์ํ ์ค์ , ํ์ ๋ฑ์ ์ฒ๋ฆฌํ๊ณ ์๋ค. createColleague
ย ๋ฉ์๋๋ ๋ํ์์์ ํ์ํยcolleague
๋ฅผ ์์ฑํ๊ณ ํ๋์ ์ ์ฅํ๋ค.- ๋ ๊ฐย
colleague
์ ๋ํดยsetMediator
๋ฅผ ํธ์ถํด ์ค์ฌ์์์ ์๋ฆฐ๋ค. - ๋ํ ๊ฐย
listener
ย ์ค์ ๋ ์ํํ์ฌยAWT
ย ํ๋ ์์ํฌ์์ ์ ์ ํ๊ฒ ํธ์ถ๋ ์ ์๋๋ก ํ๋ค. - ์ด ํ๋ก๊ทธ๋จ์์ ๊ฐ์ฅ ์ค์ํ ๋ฉ์๋๋ย
colleagueChanged
ย ๋ฉ์๋์ด๋ค. - ์ด ๋ฉ์๋์์ ํ์์ ํ์ฑ/๋นํ์ฑํ๋ฅผ ์ ์ ํ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๋ค.ย
- ์ฆ, ๋ชจ๋ ย
colleague
์ ์ํ ๋ณํ๊ฐยcolleagueChanged
ย ๋ฉ์๋๋ก ์ง๊ฒฐ๋๋ค.
Main
ย ํด๋์ค
1
2
3
4
5
public class Main {
static public void main(String[] args) {
new LoginFrame("Mediator Sample");
}
}
LoginFrame
์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.ยmain
ย ๋ฉ์๋๊ฐ ๋๋๋๋ผ๋ยLoginFrame
์ ์ธ์คํด์ค๋ยAWT
ย ํ๋ ์์ํฌ์์ ์ ์ง๋๋ค.
Mediator
ย ํจํด์ ๋ฑ์ฅ์ธ๋ฌผ
Mediator
ย ์ธํฐํ์ด์ค
colleague
์ ํต์ ํ๊ณ ์กฐ์ ํ๋ ์ธํฐํ์ด์คยAPI
๋ฅผ ์ ์ํ๋ ์ค์ฌ์ยMediator
ย ์ญํ ์ ํ๋ค.
LoginFrame
ย ํด๋์ค
- ์ค์ฌ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด ์ค์ ๋ก ์กฐ์ ํ๋ ๊ตฌ์ฒด์ ์ธ ์ค์ฌ์ย
CreateMediator
ย ์ญํ ์ ํ๋ค.
Colleague
ย ์ธํฐํ์ด์ค
- ์ค์ฌ์์ ํต์ ํ๋ ์ธํฐํ์ด์คย
API
๋ฅผ ์ ์ํ๋ ๋๋ฃยColleague
ย ์ญํ ์ ํ๋ค.
ColleagueButton
,ย ColleagueTextField
,ย ColleagueCheckbox
ย ํด๋์ค
- ๋๋ฃ ์ญํ ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ตฌ์ฒด์ ์ธ ๋๋ฃย
ConcreteColleague
ย ์ญํ ์ ํ๋ค.
์ฑ ์์ ์ ์ํ๋ ํํธ
๋ถ์ฐ์ด ์คํ๋ ค ํ๋ฅผ ๋ถ๋ฅผ ๋
- ์์ ํ๋ก๊ทธ๋จ์ย
LoginFrame
ย ํด๋์ค์ ์๋ยcolleagueChanged
ย ๋ฉ์๋๋ ๋ค์ ๋ณต์กํ๋ค. - ์ฌ์์ด ๋ณ๊ฒฝ๋๋ฉด ๊ฒฐ๊ตญ ๋ฒ๊ทธ๊ฐ ์๊ธธํ ๋ฐ, ๊ทธ๊ฑด ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
- ๊ฐ๋ น ๋ฒ๊ทธ๊ฐ ์๊ธฐ๋๋ผ๋ ํ์ ํ์ฑ/๋นํ์ฑ์ ๋ํ ๋ก์ง์ ์ด๊ณณ์๋ง ์กด์ฌํ๋ฏ๋ก ์ฌ๊ธฐ๋ง ๋๋ฒ๊น ๋ฐ ์์ ํ๋ฉด ๋๋ค.
- ๋ง์ฝ ๋ก์ง์ด ๋ถ์ฐ๋์ด ์๋ค๋ฉด ๊ต์ฅํ ๊ณจ์น ์ํ๊ฒ ๋๋ค.
- ๊ฐ์ฒด ์งํฅ์์๋ ํ ๊ณณ์ผ๋ก ์ง์คํ๋ ๊ฒ์ ํผํ๊ณ ์ฒ๋ฆฌ๋ฅผ ๋ถ์ฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- ์ฆ ๋ฌธ์ ๋ฅผ ๋ถํ ํด์ ์ฒ๋ฆฌํ๋ ๊ฒ์ธ๋ฐ, ์ด๋ฒ ์์ ํ๋ก๊ทธ๋จ ๊ฐ์ ๊ฒฝ์ฐ ๊ฐ ํด๋์ค๋ก ์ฒ๋ฆฌ๋ฅผ ๋ถ์ฐํ๋ ๊ฒ์ ํ๋ช ํ์ง ์๋ค.ย
- ๊ฐ ํด๋์ค๋ก ๋ถ์ฐํ ๊ฒ์ ๋ถ์ฐํ๊ณ ์ง์คํ ๊ฒ์ ์ง์คํ์ง ์์ผ๋ฉด ํด๋์ค์ ๋ถ์ฐ์ด ์คํ๋ ค ํ๋ฅผ ๋ถ๋ฅด๊ฒ ๋๋ค.
ํต์ ๊ฒฝ๋ก์ ์ฆ๊ฐ
- ์ธ์คํด์ค๊ฐ 2๊ฐ์ผ ๋๋ ํต์ ๊ฒฝ๋ก๊ฐย
A -> B
,ยB -> A
๋ก 2๊ฐ, ์ธ์คํด์ค๊ฐ 3๊ฐ์ผ ๋๋ 6๊ฐ, ์ธ์คํด์ค๊ฐ 4๊ฐ์ผ ๋๋ 12๊ฐ๋ก ๋์ด๋๊ณ , ์ด๋ ๊ฒ ๊ฐ์ ์ ์ฅ์ ์ธ์คํด์ค๊ฐ ์ฆ๊ฐํ ์๋ก ์๋ก ํต์ ํ๊ฒ ๋๋ฉด ํ๋ก๊ทธ๋จ์ด ๋ณต์กํด์ง๋ค. - ์ธ์คํด์ค ์๊ฐ ์ ์ ๋๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง ์ธ์คํด์ค๋ฅผ ๋๋ ค๊ฐ๋ค๋ณด๋ฉด ์ด๋๊ฐ์์ ๋ฌธ์ ๊ฐ ํฐ์ง๊ฒ ๋๋ค.
- ์ด๋ฌํ ํต์ ๊ฒฝ๋ก์ ๊ฐํ๋ฅธ ์ฆ๊ฐ๋ฅผ ์ต์ ํ๋ ๊ฒ์ดย
Mediator
ย ํจํด์ด๋ค.
์ฌ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋ฌด์์ธ๊ฐ?
- ๊ตฌ์ฒด์ ์ธ ๋๋ฃ ์ญํ ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ์ง๋ง, ๊ตฌ์ฒด์ ์ธ ์ค์ฌ์ ์ญํ ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค.
- ์๋ฅผ ๋ค์ด ๋ก๊ทธ์ธ ์์์๋ ๋ณ๋์ ๋ํ์์๋ฅผ ๋ง๋ ๋ค๊ณ ํ๋ฉดย
ColleagueButton
,ยColleagueTextField
,ยColleagueCheckbox
ย ํด๋์ค๋ ์๋ก์ด ๋ํ์์์์ ์ฌ์ฌ์ฉํ ์ ์๋ค. - ํ์ง๋ง ์ฝ๋ ์ค ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ ์์กด์ฑ์ด ๋์ ๋ถ๋ถ์ ๊ตฌ์ฒด์ ์ธ ์ค์ฌ์ ์ญํ ์ธย
LoginFrame
์ ๋ชจ๋ ๋ฃ์ด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ ํด๋น ํด๋์ค๋ฅผ ๋ค๋ฅธ ๋ํ์์๋ฅผ ๊ฐ๋ฐํ๋๋ฐ ์ฌ์ฌ์ฉํ๊ธฐ๋ ์ด๋ ต๋ค.
GUI
ย ํ๋ก๊ทธ๋๋ฐ ํ ๋ ์ฃผ์ํ ์
- ์์ ํ๋ก๊ทธ๋จ์์๋ ํจํด์ ์ค๋ช
ํ ๋ชฉ์ ์ผ๋กย
AWT
๋ฅผ ๋ค์ ๋ฒ๊ฑฐ๋กญ๊ฒ ๊ตฌํํ ์ ์ด ์๋ค. - ๋ ์๋ก์ดย
GUI
ย ํดํท์ด ์ฌ๋ฌ ๊ฐ ์์ผ๋ฉฐ ๊ฐ๊ฐ ๊ตฌํ ๋ฐฉ์์ด ๋ค๋ฅด๋ค๋ ์ ์ ์ฃผ์ํ์.
This post is licensed under CC BY 4.0 by the author.