βοΈ Java Design-Pattern XX - State
βοΈ Java Design-Pattern XX - State
π
γJAVA μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ : μ½κ² λ°°μ°λ GoFμ 23κ°μ§ λμμΈ ν¨ν΄γ
λ₯Ό μ½κ³ μ 리ν κΈμ λλ€.
State
ν¨ν΄μ΄λ?
Java
μμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ν λ νλ‘κ·Έλλ° λμμ ν΄λμ€λ‘ νννλ€.State
ν¨ν΄μμλ μνλ₯Ό ν΄λμ€λ‘ νννλ€.- μνλ₯Ό ν΄λμ€λ‘ νννλ©΄ ν΄λμ€λ₯Ό μ νν¨μΌλ‘μ¨ μν λ³νλ₯Ό λνλΌ μ μμΌλ©°, μλ‘μ΄ μνλ₯Ό μΆκ°ν΄μΌ ν λ 무μμ νλ‘κ·Έλλ° ν μ§ λͺ νν΄μ§λ€.
μμ νλ‘κ·Έλ¨
λ€μμ κΈκ³ κ²½λΉ μμ€ν μ μμ νλ‘κ·Έλ¨μΌλ‘ λ§λ κ²μ΄λ€.
- νλ‘κ·Έλ¨ μμ 1μ΄λ₯Ό νμ€ μΈκ³μ 1μκ°μΌλ‘ κ°μ νλ€.
- κΈκ³ κ° νλ μλ€.
- κΈκ³ λ κ²½λΉ μΌν°μ μ°κ²°λμ΄ μλ€.
- κΈκ³ μλ λΉμ벨과 μΌλ° ν΅νμ© μ νκ° μ°κ²°λμ΄ μλ€.
- κΈκ³ μλ μκ³κ° μ€μΉλμ΄ μμ΄, νμ¬ μκ°μ κ°μνλ€.
- μ£Όκ°μ
9:00 ~ 16:59
, μΌκ°μ17:00 ~ 23:59
λ°0:00 ~ 8:59
λ²μμ΄λ€. - κΈκ³ λ μ£Όκ°μλ§ μ¬μ©ν μ μλ€.
- μ£Όκ°μ κΈκ³ λ₯Ό μ¬μ©νλ©΄ κ²½λΉ μΌν°μ λΉμ벨 ν΅λ³΄κ° κ°λ€.
- μΌλ° ν΅νμ© μ νλ μΈμ λΌλ μ¬μ©ν μ μλ€.(λ¨, μΌκ°μ λ Ήμλ§ κ°λ₯)
- μ£Όκ°μ μ νλ₯Ό μ¬μ©νλ©΄ κ²½λΉ μΌν°κ° νΈμΆλλ€.
- μΌκ°μ μ νλ₯Ό μ¬μ©νλ©΄ κ²½λΉ μΌν°μ μλ μλ΅κΈ°κ° νΈμΆλλ€.
State
ν¨ν΄μ μ¬μ©νμ§ μλ μμ¬ μ½λ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
κ²½λΉ μμ€ν
ν΄λμ€ {
κΈκ³ μ¬μ© μ νΈμΆλλ λ©μλ() {
if (μ£Όκ°) {
κ²½λΉ μΌν°μ μ¬μ© κΈ°λ‘
} else if (μΌκ°) {
κ²½λΉ μΌν°μ λΉμ μν© κΈ°λ‘
}
}
λΉμ벨 μ¬μ© μ νΈμΆλλ λ©μλ() {
κ²½λΉ μΌν°μ λΉμ벨 ν΅λ³΄
}
μΌλ° ν΅ν μ νΈμΆλλ λ©μλ() {
if (μ£Όκ°) {
κ²½λΉ μΌν° νΈμΆ
} else if (μΌκ°) {
κ²½λΉ μΌν° μλ μλ΅κΈ° νΈμΆ
}
}
}
State
ν¨ν΄μ μ¬μ©ν μμ¬ μ½λ
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
μ£Όκ° μνλ₯Ό νμνλ ν΄λμ€ {
κΈκ³ μ¬μ© μ νΈμΆλλ λ©μλ() {
κ²½λΉ μΌν°μ μ¬μ© κΈ°λ‘
}
λΉμ벨 μ¬μ© μ νΈμΆλλ λ©μλ() {
κ²½λΉ μΌν°μ λΉμ벨 ν΅λ³΄
}
μΌλ° ν΅ν μ νΈμΆλλ λ©μλ() {
κ²½λΉ μΌν° νΈμΆ
}
}
μΌκ° μνλ₯Ό νμνλ ν΄λμ€ {
κΈκ³ μ¬μ© μ νΈμΆλλ λ©μλ() {
κ²½λΉ μΌν°μ λΉμ μν© κΈ°λ‘
}
λΉμ벨 μ¬μ© μ νΈμΆλλ λ©μλ() {
κ²½λΉ μΌν°μ λΉμ벨 ν΅λ³΄
}
μΌλ° ν΅ν μ νΈμΆλλ λ©μλ() {
κ²½λΉ μΌν° μλ μλ΅κΈ° νΈμΆ
}
}
State
ν¨ν΄μ μ¬μ©νμ§ μλ μμ¬ μ½λμμλ μ£Όκ°, μΌκ°μ΄λΌλ μνκ° κ° λ©μλμif
λ¬Έ λΆλΆμ λ±μ₯νλ€.- λ°λ©΄
State
ν¨ν΄μ μ¬μ©νλ μμ¬ μ½λμμλ μνκ° ν΄λμ€λ‘ ννλμκΈ° λλ¬Έμ, κ° λ©μλμλ νμ¬ μνλ₯Ό 체ν¬νλif
λ¬Έμ΄ λ±μ₯νμ§ μλλ€.
State
μΈν°νμ΄μ€
1
2
3
4
5
6
public interface State {
public abstract void doClock(Context context, int hour);
public abstract void doUse(Context context);
public abstract void doAlarm(Context context);
public abstract void doPhone(Context context);
}
- κΈκ³ μνλ₯Ό λνλ΄λ μΈν°νμ΄μ€λ€.
- μκ°μ΄ μ€μ λμμ λ, κΈκ³ κ° μ¬μ©λμμ λ, λΉμλ²¨μ΄ λλ Έμ λ, μΌλ° ν΅νλ₯Ό ν λ νΈμΆλλ€.
- μΈμλ‘ μ λ¬λλ
Context
λ μνλ₯Ό κ΄λ¦¬νλ μΈν°νμ΄μ€λ€.
DayState
ν΄λμ€
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
public class DayState implements State {
private static DayState singleton = new DayState();
private DayState() { }
public static State getInstance() {
return singleton;
}
@Override
public void doClock(Context context, int hour) {
if (hour < 9 || 17 <= hour) {
context.changeState(NightState.getInstance());
}
}
@Override
public void doUse(Context context) {
context.recordLog("κΈκ³ μ¬μ©(μ£Όκ°)");
}
@Override
public void doAlarm(Context context) {
context.callSecurityCenter("λΉμ벨(μ£Όκ°)");
}
@Override
public void doPhone(Context context) {
context.callSecurityCenter("μΌλ°ν΅ν(μ£Όκ°)");
}
@Override
public String toString() {
return "[μ£Όκ°]";
}
}
- μ£Όκ° μνλ₯Ό λνλ΄λ ν΄λμ€λ‘,
State
μΈν°νμ΄μ€μμ μ μΈλ λ©μλλ₯Ό ꡬννλ€. - μνλ₯Ό λνλ΄λ ν΄λμ€λ μΈμ€ν΄μ€λ₯Ό νλμ©λ§ λ§λ λ€.
- μνκ° λ³νν λλ§λ€ μΈμ€ν΄μ€λ₯Ό λ§λ€λ©΄ λ©λͺ¨λ¦¬μ μκ°μ΄ λλΉλκΈ° λλ¬Έμ΄λ€.
- κ·Έ λλ¬Έμ
Singleton
ν¨ν΄μ μ¬μ©νλ€. doClock()
λ©μλλ μ£Όμ΄μ§ μκ°μ΄ μΌκ°μ΄λ©΄ μΌκ° μνλ‘ μμ€ν μ μ ννλ€.doUse()
,doAlarm()
,doPhone()
λ©μλλ κ°κ° κΈκ³ μ¬μ©, λΉμ벨, μΌλ° ν΅νλΌλ μ¬κ±΄μ λμνλ€.- μ΄λ€ λ©μλ μμ νμ¬ μνλ₯Ό 체ν¬νλ
if
λ¬Έμ μ‘΄μ¬νμ§ μλλ€. - μ΄λ λ―
State
ν¨ν΄μμλ μνμ μ°¨μ΄κ° ν΄λμ€μ μ°¨μ΄λ‘ λνλλ―λ‘if
,switch
λ± μν λ³λ‘ λΆκΈ°ν νμκ° μλ€.
NightState
ν΄λμ€
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
public class NightState implements State {
private static NightState singleton = new NightState();
private NightState() { }
public static State getInstance() {
return singleton;
}
@Override
public void doClock(Context context, int hour) {
if (9 <= hour && hour < 17) {
context.changeState(DayState.getInstance());
}
}
@Override
public void doUse(Context context) {
context.callSecurityCenter("λΉμοΌμΌκ° κΈκ³ μ¬μ©οΌ");
}
@Override
public void doAlarm(Context context) {
context.callSecurityCenter("λΉμ벨(μΌκ°)");
}
@Override
public void doPhone(Context context) {
context.recordLog("μΌκ° ν΅ν λ
Ήμ");
}
@Override
public String toString() {
return "[μΌκ°]";
}
}
- μΌκ° μνλ₯Ό λνλ΄λ ν΄λμ€λ‘,
State
μΈν°νμ΄μ€μμ μ μΈλ λ©μλλ₯Ό ꡬννλ€. - μ΄ ν΄λμ€ λν
Singleton
ν¨ν΄μ μ¬μ©νλ€.
Context
μΈν°νμ΄μ€
1
2
3
4
5
6
public interface Context {
public abstract void setClock(int hour); // μκ° μ€μ
public abstract void changeState(State state); // μν λ³ν
public abstract void callSecurityCenter(String msg); // κ²½λΉ μΌν° κ²½λΉμ νΈμΆ
public abstract void recordLog(String msg); // κ²½λΉ μΌν° κΈ°λ‘
}
- μνλ₯Ό κ΄λ¦¬νκ±°λ κ²½λΉ μΌν°λ₯Ό νΈμΆνλ€.
SafeFrame
ν΄λμ€
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
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SafeFrame extends Frame implements ActionListener, Context {
private TextField textClock = new TextField(60); // νμ¬ μκ° νμ
private TextArea textScreen = new TextArea(10, 60); // κ²½λΉ μΌν° μΆλ ₯
private Button buttonUse = new Button("κΈκ³ μ¬μ©"); // κΈκ³ μ¬μ© λ²νΌ
private Button buttonAlarm = new Button("λΉμ벨"); // λΉμ벨 λ²νΌ
private Button buttonPhone = new Button("μΌλ° ν΅ν"); // μΌλ° ν΅ν λ²νΌ
private Button buttonExit = new Button("μ’
λ£"); // μ’
λ£ λ²νΌ
private State state = DayState.getInstance(); // νμ¬ μν
/* μμ±μ */
public SafeFrame(String title) {
super(title);
setBackground(Color.lightGray);
setLayout(new BorderLayout());
// textClock λ°°μΉ
add(textClock, BorderLayout.NORTH);
textClock.setEditable(false);
// textScreen λ°°μΉ
add(textScreen, BorderLayout.CENTER);
textScreen.setEditable(false);
// ν¨λμ λ²νΌ μ μ₯
Panel panel = new Panel();
panel.add(buttonUse);
panel.add(buttonAlarm);
panel.add(buttonPhone);
panel.add(buttonExit);
// κ·Έ ν¨λμ λ°°μΉ
add(panel, BorderLayout.SOUTH);
// νμ
pack();
setVisible(true);
// 리μ€λ μ€μ
buttonUse.addActionListener(this);
buttonAlarm.addActionListener(this);
buttonPhone.addActionListener(this);
buttonExit.addActionListener(this);
}
/* λ²νΌμ΄ λ리면 μ¬κΈ°λ‘ μ¨λ€ */
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.toString());
if (e.getSource() == buttonUse) { // κΈκ³ μ¬μ© λ²νΌ
state.doUse(this);
} else if (e.getSource() == buttonAlarm) { // λΉμ벨 λ²νΌ
state.doAlarm(this);
} else if (e.getSource() == buttonPhone) { // μΌλ° ν΅ν λ²νΌ Β
state.doPhone(this);
} else if (e.getSource() == buttonExit) { // μ’
λ£ λ²νΌ
System.exit(0);
} else {
System.out.println("?");
}
}
/* μκ° μ€μ */
@Override
public void setClock(int hour) {
String clockstring = String.format("νμ¬ μκ°μ %02d:00", hour);
System.out.println(clockstring);
textClock.setText(clockstring);
state.doClock(this, hour);
}
/* μν λ³ν */
@Override
public void changeState(State state) {
System.out.println(this.state + "μμ" + state + "μΌλ‘ μνκ° λ³ννμ΅λλ€.");
this.state = state;
}
/* κ²½λΉ μΌν° κ²½λΉμ νΈμΆ */
@Override
public void callSecurityCenter(String msg) {
textScreen.append("call! " + msg + "\n");
}
/* κ²½λΉ μΌν° κΈ°λ‘ */
@Override
public void recordLog(String msg) {
textScreen.append("record ... " + msg + "\n");
}
}
Context
μΈν°νμ΄μ€λ₯Ό ꡬννμ¬GUI
λ₯Ό ν΅ν΄ κΈκ³ κ²½λΉ μμ€ν μ μ€ννλ€.SafeFrame
ν΄λμ€μ νλλ νλ©΄μ νμλλ ν μ€νΈ νλλ ν μ€νΈ μμ, λ²νΌ λ±μ λΆνμ΄λ€.- λ¨
state
νλλ νλ©΄ μ λΆνμ΄ μλ κΈκ³ μ νμ¬ μνλ₯Ό λνλΈλ€. - μμ±μμμλ λ€μκ³Ό κ°μ μ²λ¦¬λ₯Ό νλ€.
- λ°°κ²½μ μ€μ
- λ μ΄μμ κ΄λ¦¬μ μ€μ
- λΆν λ°°μΉ
- 리μ€λ μ€μ
- κ° λ²νΌμ
addActionListener()
λ©μλλ₯Ό νΈμΆνμ¬ λ¦¬μ€λλ₯Ό μ€μ νλ€. - μ΄ λ ν΄λΉ λ©μλμ μΈμλ‘ λ²νΌμ λλ μ λ νΈμΆλ μΈμ€ν΄μ€λ₯Ό κ²°μ νλ€.
- λν ν΄λΉ μΈμ€ν΄μ€λ
ActionListener
μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ νλ€. - λ²νΌμ λλ μ λ 리μ€λκ° νΈμΆλλ ꡬ쑰λ
Observer
ν¨ν΄κ³Ό μ μ¬νλ€. ActionPerformed()
λ©μλλ λ²νΌμ λλ μ λ νΈμΆλλ λ©μλμ΄λ€.- μ΄ λ©μλ λͺ
μ
java.awt.event.ActionListener
μΈν°νμ΄μ€μμ μ ν΄μ§ μ΄λ¦μ΄λ―λ‘ ν¨λΆλ‘ μμ ν΄μλ μλλ€. - μ΄ ν΄λμ€μ
if
λ¬Έμ΄ λ±μ₯νμ§λ§, λ²νΌ μ’ λ₯μ λμνλ κ²μ΄μ§ νμ¬ μνμ λμνλ κ²μ΄ μλμ μ£Όμν΄μΌ νλ€. - κ°λ Ή κΈκ³ μ¬μ© λ²νΌμ λλ₯΄λ©΄
state.doUse(this)
λ©μλκ° μ€νλλ€. State
ν¨ν΄μ μ¬μ©νκΈ° λλ¬Έμ νμ¬ μκ°μ΄λ νμ¬ κΈκ³ μνλ₯Ό μ‘°μ¬νλ λΆκΈ° μ²λ¦¬κ° λΆνμνλ€.setClock()
λ©μλλ μκ°μ νμνκ³ , μκ°μ λν μνλ₯Ό μ€μ νλ€.changeState()
λ©μλλDayState
λλNightState
ν΄λμ€μμ νΈμΆλλ€.callSecurityCenter()
λ©μλλ κ²½λΉ μΌν° νΈμΆμ λνλ΄λ©°recordLog
λ©μλλ κ²½λΉ μΌν°μ κΈ°λ‘μ λνλΈλ€.
Main
ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
SafeFrame frame = new SafeFrame("State Sample");
while (true) {
for (int hour = 0; hour < 24; hour++) {
frame.setClock(hour); // μκ° μ€μ
try {
Thread.sleep(1000);
} catch (InterruptedException e) { }
}
}
}
}
SafeFrame
μΈμ€ν΄μ€λ₯Ό νλ λ§λ€κ³ , κ·Έ μΈμ€ν΄μ€μ λν΄ μ κΈ°μ μΌλ‘ μκ°μ μ€μ νλ€.- μκ° μ€μ μ 1μ΄λ§λ€ μ΄λ€μ§λλ°, νλ‘κ·Έλ¨ μμμλ 1μκ°μ ν΄λΉνλ€.
State
ν¨ν΄μ λ±μ₯μΈλ¬Ό
State
μΈν°νμ΄μ€
- μνλ§λ€ λ€λ₯΄κ² λμνλ μΈν°νμ΄μ€λ₯Ό μ μνλ€.
- μ΄ μΈν°νμ΄μ€λ μνμ μμ‘΄ν λ©μλ λͺ¨μμ΄ λλ€.
- μνλ₯Ό λνλ΄λ μν(
State
) μμ λ§‘μλ€.
DayState
, NightState
ν΄λμ€
- ꡬ체μ μΈ κ°κ°μ μνλ₯Ό λνλΈλ€.
State
μμ μ μλ μΈν°νμ΄μ€λ₯Ό ꡬννλ ꡬ체μ μΈ μν(ConcreteState
) μμ λ§‘μλ€.
Context
μΈν°νμ΄μ€, SafeFrame
ν΄λμ€
State
ν¨ν΄ μ¬μ©μμκ² νμν μΈν°νμ΄μ€λ₯Ό μ μνλ λ¬Έλ§₯(Context
) μμ λ§‘μλ€.Context
μΈν°νμ΄μ€κ° μΈν°νμ΄μ€λ₯Ό μ μνκ³SafeFrame
ν΄λμ€κ°ConcreteState
λ₯Ό κ°μ§λ λΆλΆμ λ§‘μλ€.
μ± μμ μ μνλ ννΈ
λΆν ν΄μ ν΅μΉνλΌ.
- ν¬κ³ 볡μ‘ν λ¬Έμ λ₯Ό κ·Έλλ‘ ν΄κ²°νλ € ν΄μ μλλ€.
- μμ λ¬Έμ λ‘ λλκ³ , κ·Έλλ νλ€λ€λ©΄ λ μκ² λλ μΌ νλ€.
- κ°λ¨ν λ§νλ©΄, λΆν ν΄μ ν΅μΉνλΌλ λ§μ κΉλ€λ‘μ΄ λ¬Έμ λ₯Ό νλ νΈλ λμ μκ³ μ¬μ΄ λ¬Έμ λ₯Ό λ§μ΄ νλΌλ λ§μ΄λ€.
State
ν¨ν΄μμλ μνλ₯Ό ν΄λμ€λ‘ νννλλ°, κ°κ°μ ꡬ체μ μΈ μνλ₯Ό ν΄λμ€λ‘ ννν΄μ λ¬Έμ λ₯Ό λΆν ν κ²μ΄λ€.- μνκ° λ§μμ§μλ‘ ν΄λΉ ν¨ν΄μ λΉμ λ°νλ€.
- μμ μκ°ν μμ¬ μ½λμμ,
State
ν¨ν΄μ μ¬μ©νμ§ μμ κ²½μ° νμ¬ μνμ λμν 쑰건 λΆκΈ°κ° λ°μνλ κ²μ μ μ μλ€. - μνκ° λ§μμ§μλ‘ μ΄ μ‘°κ±΄ λΆκΈ°λ λμ΄λκΈ° λλ¬Έμ νλ‘κ·Έλ¨μ 볡μ‘μ±μ΄ μ¦κ°νλ€.
μνμ μμ‘΄ν μ²λ¦¬
SafeFrame
ν΄λμ€μsetClock()
λ©μλλMain
ν΄λμ€μμ νΈμΆλλ€.- ν΄λΉ λ©μλλ₯Ό ν΅ν΄ μκ° μ€μ μ μ§μνκ³
setClock()
λ©μλ λ΄λΆμμλ λ€μκ³Ό κ°μ΄state
μ μμνλ€.
1
state.doClock(this, hour);
- μ¦, μκ° μ€μ μ νμ¬ μνμ μμ‘΄νλ μ²λ¦¬λ‘ λ€λ£¬λ€.
doClock
λΏλ§ μλλΌState
μΈν°νμ΄μ€μ μ μλ λ©μλλ λͺ¨λ μνμ λ°λΌ λμμ΄ λ¬λΌμ§λ μ²λ¦¬λ€.State
ν¨ν΄μμλ μνμ μμ‘΄νλ μ²λ¦¬λ₯Ό νλ‘κ·Έλ¨μΌλ‘ λ€μκ³Ό κ°μ΄ νννλ€.
- μΆμ λ©μλλ‘ μ μΈνκ³ μΈν°νμ΄μ€λ‘ νλ€.
- ꡬμ λ©μλλ‘ κ΅¬ννκ³ κ°λ³ ν΄λμ€λ‘ νλ€.
μν μ νμ λκ° κ΄λ¦¬ν΄μΌ νλκ°?
- μμ νλ‘κ·Έλ¨μμλ
Context
μμ λ§‘μSafeFrame
ν΄λμ€κ° μ€μ λ‘ μνλ₯Ό μ ννλchangeState()
λ©μλλ₯Ό ꡬννλ€. - ν΄λΉ λ©μλλ₯Ό μ€μ λ‘ νΈμΆνλ κ²μ
DayState
λλNightState
ν΄λμ€μ΄λ€. - μ¦, μμ νλ‘κ·Έλ¨μμλ μν μ νμ μνμ μμ‘΄νλ λμμΌλ‘ μκ°νλ€.
- μ΄ λ°©μμλ μ₯λ¨μ μ΄ κ°κ° μ‘΄μ¬νλ€.
- μ₯μ μ λ€λ₯Έ μνλ‘ μ ννλ μμ μ λν μ λ³΄κ° ν ν΄λμ€ λ΄μ μλ€λ μ μ΄λ€.
- μλ₯Ό λ€μ΄
DayState
ν΄λμ€κ° μΈμ λ€λ₯Έ μνλ‘ μ ννλ μ§ μκ³ μΆλ€λ©΄ λ¨μν ν΄λΉ ν΄λμ€μ μ½λλ₯Ό μ½μΌλ©΄ λλ€. - λ¨μ μ ν ꡬ체μ μΈ μν μμ΄ λ€λ₯Έ ꡬ체μ μΈ μν μμ μμμΌ νλ€λ μ μ΄λ€.
- κ°λ Ή
DayState
ν΄λμ€μμλdoClock()
λ©μλ μμμNightState
μΈμ€ν΄μ€λ₯Ό μ¬μ©νλ€. - μ¦, λμ€μ
NightState
ν΄λμ€λ₯Ό μμ νκ² λλ€λ©΄DayState
ν΄λμ€λ μμ ν΄μΌ νλ€. - μ΄λ¬ν μ μ ν΄λμ€ μ¬μ΄μ μμ‘΄ κ΄κ³λ₯Ό κΉκ² λ§λ€μ΄ λ²λ¦°λ€.
- μμ νλ‘κ·Έλ¨κ³Ό κ°μ λ°©μμ κ·Έλ§λκ³ λͺ¨λ μν μ νμ
Context
μμSafeFrame
ν΄λμ€μ λ§‘κΈΈ μλ μλ€. - κ·Έλ κ² νλ€λ©΄ κ°λ³ ꡬ체μ μΈ μν μμ λ 립μ±μ΄ μ’μμ Έμ μ 체 νλ‘κ·Έλ¨μ μ λ§μ΄ ν₯μλλ κ²½μ°κ° μλ€.
- λλ
State
ν¨ν΄ λμ μν ν μ΄λΈμ μ¬μ©νμ¬ μ€κ³ν μλ μλ€. - ν μ΄λΈμ μ λ ₯κ³Ό λ΄λΆ μνλ₯Ό λ°νμΌλ‘ μΆλ ₯κ³Ό λ€μ λ΄λΆ μνλ₯Ό μ»μ μ μλ μλ¦Όνκ° λλ€.
- μν λ³κ²½μ΄ κ³ μ λ κ·μΉμ λ°νμ λ κ²½μ°μλ μ΄μ²λΌ ν μ΄λΈμ μ¬μ©νλ νλ‘κ·Έλ¨λ ν¨κ³Όμ μ΄λΌκ³ ν μ μλ€.
- μν μκ° λ§μ κ²½μ°μλ μμμ μ ν¬κΈ°νκ³ , νλ‘κ·Έλ¨μ μλμΌλ‘ μμ±νλ λ€λ₯Έ νλ‘κ·Έλ¨μ μ¬μ©νλ λ°©λ²λ μλ€.
μκΈ° λͺ¨μμ λΉ μ§μ§ μλλ€.
State
ν¨ν΄μ μ¬μ©νμ§ μκ³ μμ€ν μνκ° μ¬λ¬ λ³μ«κ°μ μ§ν©μΌλ‘ ννλμ΄ μλ€κ³ κ°μ ν΄λ³΄μ.- μ΄λ λ³μ«κ° μ¬μ΄μ μκΈ° λͺ¨μμ΄λ λΆμΌμΉκ° μμ΄μΌ νλ€.
State
ν¨ν΄μμλ μνλ₯Ό ν΄λμ€λ‘ νννκ³ , νμ¬ μνλ₯Ό νννλ λ³μλ λ¨ νλμ΄λ€.- κ·Έλ κΈ° λλ¬Έμ ν΄λΉ λ³μκ° μμ€ν μ μνλ₯Ό νμ€ν κ²°μ νλ―λ‘ μκΈ° λͺ¨μμ λ΄ν¬ν μνλΌλ κ²μ΄ μ‘΄μ¬νμ§ μκ² λλ€.
μλ‘μ΄ μνλ₯Ό μΆκ°νλ κ²μ κ°λ¨νλ€.
- μμ νλ‘κ·Έλ¨μΌλ‘ μλ₯Ό λ€λ©΄,
State
μΈν°νμ΄μ€λ₯Ό ꡬννXxxState
ν΄λμ€λ₯Ό λ§λ€κ³ , νμν λ©μλλ₯Ό ꡬννλ©΄ λλ€. - λ¬Όλ‘ μν μ ν λΆλΆμ λ€λ₯Έ ꡬ체μ μΈ μν μκ³Όμ μ μ μ΄ λλ―λ‘ μ£Όμν΄μ ꡬνν΄μΌ νλ€.
- λ°λ©΄ μμ±λ
State
ν¨ν΄μ μλ‘μ΄ μν μμ‘΄ μ²λ¦¬λ₯Ό ꡬννλ κ²μ μ΄λ ΅λ€. State
μμ μΈν°νμ΄μ€μ λ©μλλ₯Ό μΆκ°νλ κ²μ μλ―Ένλλ°, λͺ¨λ ꡬ체μ μΈ μν μμ μ²λ¦¬λ₯Ό μΆκ°ν΄μΌ νκΈ° λλ¬Έμ΄λ€.- λ¬Όλ‘ λ©μλλ₯Ό μΆκ°νμ§ μμΌλ©΄ μ»΄νμΌν λ λ©μλκ° κ΅¬νλμ§ μμμμ μ€λ₯λ‘ μλ €μ£ΌκΈ° λλ¬Έμ λλ½λ μνμ μλ€.
- λ§μΌ
State
ν¨ν΄μ μ¬μ©νμ§ μλλ€λ©΄, μνλ₯Ό νλ¨νλ κ²μif
λ¬Έ μμ 쑰건μμ΄κΈ° λλ¬Έμ, μ€λ₯λ₯Ό μ»΄νμΌν λ κ²μΆνκΈ° μ΄λ ΅λ€. - μ°Έκ³ λ‘ κ³ λ €νμ§ μμ μνλ₯Ό κ²μΆνλ©΄ μ€λ₯λ‘ μ²λ¦¬νλ©΄ λκΈ° λλ¬Έμ μ€νν λ κ²μΆνλ κ²μ μ΄λ ΅μ§ μλ€.
λ μΌκ΅΄μ κ°μ§ μΈν°νμ΄μ€
SafeFrame
ν΄λμ€μ λ±μ₯ν λ€μ λ μ½λλ₯Ό μ΄ν΄λ³΄μ.
1
2
3
4
5
/* μμ±μ μ */
buttonUse.addActionListner(this);
/* actionPerformed μ */
state.doUse(this);
- μμ νλ‘κ·Έλ¨μμλ
SafeFrame
μΈμ€ν΄μ€κ° νλλ§ μμ±λλ―λ‘this
κ° λμΌνμ§λ§,addActionListner()
μ μ λ¬λ λμdoUse()
μ μ λ¬λ λλ μ‘°κΈ μ°¨μ΄κ° μλ€. addActionListner()
μ μ λ¬λ λλActionListener
μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ‘μ λ€λ£¨μ΄μ§λ€.- μΈμλ‘ μ λ¬λ κ²μ΄
SafeFrame
μΈμ€ν΄μ€μΈμ§ μ¬λΆλ μ€μνμ§ μλ€. doUse()
μ μ λ¬λ λλ λμΌν μΈμ€ν΄μ€κ°Context
μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ‘ λ€λ£¨μ΄μ§λ€.doUse()
λ©μλ μμμλContext
μΈν°νμ΄μ€μμ μ μλ λ©μλ λ²μμμ μΈμκ° μ΄μ©λλ€.- λμΌν νλμ μΈμ€ν΄μ€μ μ¬λ¬ μΌκ΅΄μ΄ μλ€λ μ μ κΈ°μ΅νμ.
This post is licensed under CC BY 4.0 by the author.