βοΈ Java Design-Pattern Xβ § - Observer
βοΈ Java Design-Pattern Xβ
§ - Observer
π
γJAVA μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ : μ½κ² λ°°μ°λ GoFμ 23κ°μ§ λμμΈ ν¨ν΄γ
λ₯Ό μ½κ³ μ 리ν κΈμ λλ€.
Observer
ν¨ν΄μ΄λ?
- κ΄μ°° λμμ μνκ° λ³ννλ©΄ κ΄μ°°μμκ² μλ¦°λ€.
- μν λ³νμ λ°λ₯Έ μ²λ¦¬λ₯Ό κΈ°μ ν λ ν¨κ³Όμ μ΄λ€.
μμ νλ‘κ·Έλ¨
- λ€μμ μλ₯Ό λ§μ΄ μμ±νλ κ°μ²΄λ₯Ό κ΄μ°°μκ° κ΄μ°°νκ³ κ·Έ κ°μ νμνλ νλ‘κ·Έλ¨μ΄λ€.
- λ¨, νμνλ λ°©λ²μ κ΄μ°°μμ λ°λΌ λ€λ₯΄λ€.
- κ°λ Ή
DigitObserver
λ κ°μ μ«μλ‘ νμνμ§λ§,GraphObserver
λ κ°μ κ°λ¨ν κ·Έλνλ‘ νμνλ€.
Observer
Β μΈν°νμ΄μ€
1
2
3
public interface Observer {
public abstract void update(NumberGenerator generator);
}
- κ΄μ°°μλ₯Ό λνλ΄λ μΈν°νμ΄μ€λ‘, ꡬ체μ μΈ κ΄μ°°μκ° μ΄ μΈν°νμ΄μ€λ₯Ό ꡬννκ² λλ€.
Java
ν΄λμ€ λΌμ΄λΈλ¬λ¦¬μ λ±μ₯νλjava.util.Observer
μλ λ€λ₯΄λ€.update()
λ©μλλ₯Ό νΈμΆνλ κ²μNumberGenerator
μ΄λ€.NumberGenerator
κ° βλ΄μ©μ΄ κ°±μ λμμ΄μ. νμνλ μͺ½λ κ°±μ ν΄μ£ΌμΈμ.βλΌκ³ κ΄μ°°μμ μ λ¬νκΈ° μν λ©μλμ΄λ€.
NumberGenerator
ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.ArrayList;
import java.util.List;
public abstract class NumberGenerator {
// Observer μ μ₯
private List<Observer> observers = new ArrayList<>();
// Observer μΆκ°
public void addObserver(Observer observer) {
observers.add(observer);
}
// Observerμ ν΅μ§
public void notifyObservers() {
for (Observer o : observers) o.update(this);
}
// μλ₯Ό μ·¨λ
public abstract int getNumber();
// μλ₯Ό μμ±
public abstract void execute();
}
- μλ₯Ό μμ±νλ μΆμ ν΄λμ€μ΄λ€.
- μ€μ λ‘ μλ₯Ό μμ±νκ³ μ·¨λνλ λ©μλλ νμ ν΄λμ€μμ ꡬνν΄μΌ νλ μΆμ λ©μλλ‘ κ΅¬μ±λμ΄ μλ€.
observers
λNumberGenerator
λ₯Ό κ΄μ°°νλObserver
λ₯Ό μ μ₯νλ νλμ΄λ€.
RandomNumberGenerator
ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.Random;
public class RandomNumberGenerator extends NumberGenerator {
private Random random = new Random();
private int number;
// μλ₯Ό μ·¨λ
@Override
public int getNumber() {
return number;
}
// μλ₯Ό μμ±
@Override
public void execute() {
for (int i = 0; i < 20; i++) {
number = random.nextInt(50);
notifyObservers();
}
}
}
NumberGenerator
μ νμ ν΄λμ€λ‘ λμλ₯Ό μμ±νλ€.execute()
λ©μλλ λμλ₯Ό 20κ° μμ±νκ³ , κ·Έ λλ§λ€ κ΄μ°°μμκ² ν΅μ§νλ€.
DigitObserver
ν΄λμ€
1
2
3
4
5
6
7
8
9
10
public class DigitObserver implements Observer {
@Override
public void update(NumberGenerator generator) {
System.out.println("DigitObserver:" + generator.getNumber());
try {
Thread.sleep(100);
} catch (InterruptedException e) { }
}
}
- ꡬ체μ μΈ κ΄μ°°μ ν΄λμ€λ‘, κ΄μ°°ν μλ₯Ό μ«μλ‘ νμνλ€.
GraphObserver
ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class GraphObserver implements Observer {
@Override
public void update(GraphObserver generator) {
System.out.println("GraphObserver:");
int count = generator.getNumber();
for (int i = 0; i < count; i++) System.out.println("*");
System.out.println("");
try {
Thread.sleep(100);
} catch (InterruptedException e) { }
}
}
- μ΄ ν΄λμ€λ κ΄μ°°ν μλ₯Ό κ°μ΄ κ·Έλνλ‘ νμνλ€.
Main
ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
public static void main(String[] args) {
NumberGenerator generator = new RandomNumberGenerator();
Observer observer1 = new DigitObserver();
Observer observer2 = new GraphObserver();
generator.addObserver(observer1);
generator.addObserver(observer2);
generator.execute();
}
}
- μ μμ±κΈ°μ κ΄μ°°μλ₯Ό μμ± λ° λ±λ‘ ν ν
generator.execute()
λ©μλλ₯Ό μ¬μ©νμ¬ μλ₯Ό μμ±νλ€.
Observer
ν¨ν΄μ λ±μ₯μΈλ¬Ό
NumberGenerator
ν΄λμ€
- κ΄μ°°μλ₯Ό λ±λ‘ λ° μμ νκ³ νμ¬ μνλ₯Ό κ°μ Έμ€λ λ©μλλ₯Ό κ°κ³ μμΌλ©°, κ΄μ°° λμμ(
Subject
) μμ λ§‘μλ€.
RandomNumberGenerator
ν΄λμ€
- μνκ° λ³κ²½λλ©΄ κ΄μ°°μμκ² μ리λ ꡬ체μ μΈ κ΄μ°° λμμ(
ConcreteSubject
) μμ λ§‘μλ€.
Observer
μΈν°νμ΄μ€
- κ΄μ°° λμμλ‘λΆν° βμνκ° λ³ννμ΄μβλΌκ³ μ λ¬ λ°λ κ΄μ°°μ(
Observer
) μν μ λ§‘μλ€. - μ°Έκ³ λ‘ μ λ¬λ°κΈ° μν λ©μλκ° λ°λ‘
update()
μ΄λ€.
DigitObserver
, GraphObserver
ν΄λμ€
update()
λ©μλκ° νΈμΆλλ©΄ κ·Έ μμμ κ΄μ°° λμμμ νμ¬ μνλ₯Ό μ·¨λνλ ꡬ체μ μΈ κ΄μ°°μ(ConcreteObserver
) μν μ λ§‘μλ€.
μ± μμ μ μνλ ννΈ
μ¬κΈ°μλ κ΅ν κ°λ₯μ±μ΄ λ±μ₯νλ€.
- λμμΈ ν¨ν΄μ λͺ©μ μ€ νλλ ν΄λμ€λ₯Ό μ¬μ¬μ© κ°λ₯ν λΆνμΌλ‘ λ§λλ κ²μ΄λ€.
Observer
ν¨ν΄μμλ μνλ₯Ό κ°μ§ConcreteSubject
μ μν λ³νλ₯Ό ν΅λ³΄ λ°λConcreteObserver
κ° μλ€.- κ·Έλ¦¬κ³ κ·Έ λμ μ°κ²°νλ κ²μ΄ μΈν°νμ΄μ€λ‘μμ
Subject
μObserver
λ€. - κ°λ Ή
RandomNumberGenerator
λ μμ μ κ΄μ°°νλ κ΄μ°°μκ° μ΄λ€ ν΄λμ€μ μΈμ€ν΄μ€μΈμ§ λͺ¨λ₯Έλ€. - λ€λ§
observers
νλμ μ μ₯λ μΈμ€ν΄μ€κ°Observer
μΈν°νμ΄μ€λ₯Ό ꡬννκ³ ,update
λ©μλλ₯Ό κ°μ§κ³ μλ€λ κ² μ λλ μκ³ μλ€. DigitObserver
ν΄λμ€ λν μμ μ΄ κ΄μ°°νλ λμμ΄ μ΄λ€ ν΄λμ€μ μΈμ€ν΄μ€μΈμ§ μ κ²½μ°μ§ μλλ€.- λ€λ§
RandomNumberGenerator
μ νμ ν΄λμ€μ΄κ³ ,getNumber
λ©μλλ₯Ό κ°κ³ μλ€λ κ²μ μκ³ μλ€.
- μΆμ ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό μ¬μ©νμ¬ κ΅¬μ ν΄λμ€λ‘λΆν° μΆμ ν΄λμ€λ₯Ό λΆλ¦¬νλ€.
- μΈμλ‘ μΈμ€ν΄μ€λ₯Ό μ λ¬ν λλ νλλ‘ μΈμ€ν΄μ€λ₯Ό μ μ₯ν λλ ꡬμ ν΄λμ€νμΌλ‘ νμ§ μκ³ μΆμ ν΄λμ€λ μΈν°νμ΄μ€νμΌλ‘ ν΄ λλ€.
- μ μ μ λ₯Ό μ§ν€λ ν ꡬμ ν΄λμ€ λΆλΆμ μ½κ² κ΅νν μ μλ€.
Observer
μ μμ
Subject
μμλ μ¬λ¬Observer
κ° λ±λ‘λμ΄ μλλ°, μΌλ°μ μΌλ‘ConcreteObserver
μμ ν΄λμ€λ₯Ό μ€κ³ν λλupdate()
λ©μλκ° νΈμΆλλ μμκ° λ°λμ΄λ λ¬Έμ κ° μκΈ°μ§ μλλ‘ ν΄μΌ νλ€.- μ μ΄μ κ° ν΄λμ€μ λ 립μ±μ΄ μ λλ‘ μ μ§λλ©΄, μμ‘΄μ±μ νΌλμ μΌμ΄λμ§ μλλ€.
Observer
μ νμκ° Subject
μ μν₯μ λ―ΈμΉ λ
Observer
ν¨ν΄μμλSubject
κ°update()
λ©μλλ₯Ό νΈμΆνλ κ³κΈ°κ° λ€λ₯Έ ν΄λμ€λ‘λΆν° μ€κΈ°λ νλ€.- μλ₯Ό λ€μ΄
GUI
μμ μ¬μ©μκ° λ²νΌμ λλ₯΄λ μ΄λ²€νΈλ₯Ό κ³κΈ°λ‘update()
λ©μλκ° νΈμΆλλ κ²½μ°κ° μμ£Ό μλ€. - λμμ
Subject
κ°update()
λ©μλλ₯Ό νΈμΆνλ κ³κΈ°κ° ν΄λΉObserver
μΈ κ²½μ°λ μλλ°, μ΄λ° κ²½μ° μ‘°μ¬ν΄μ μ€κ³νμ§ μμΌλ©΄ λ©μλ νΈμΆμ΄ μμν λ°λ³΅λ μ μλ€. Subject
μν λ³ν βObserver
λ‘ ν΅μ§Observer
κ°Subject
μ λ©μλ νΈμΆ βSubject
μν λ³ν β...
- κ·Έλ κΈ° λλ¬Έμ νμ¬ ν΅μ§ μ²λ¦¬ μ€μΈμ§λ₯Ό
Observer
κ° νλ¨νκ±°λ, ν΅μ§νλ νμ΄λ°μSubject
κ° κ³ λ €νλ λ±μ λμ± μ΄ νμνλ€.
κ°±μ μ μν ννΈ μ 보 λ€λ£¨κΈ°
RandomNumberGenerator
λupdate()
λ©μλλ₯Ό μ¬μ©νμ¬ βκ°±μ λμ΄μβλΌκ³Observer
μκ² ν΅μ§νλ€.update()
λ©μλμ μΈμλ‘ μ£Όμ΄μ§λ κ²μRandomNumberGenerator
μΈμ€ν΄μ€ λΏμ΄κΈ° λλ¬Έμ,Observer
λgetNumber()
λ©μλλ₯Ό νΈμΆνμ¬ νμλ‘ νλ κ°μ μ»μ΄μΌ νλ€.- μν©μ λ°λΌ λ€μκ³Ό κ°μ΄ μ μ νκ² ννΈ μ 보λ₯Ό λκΈΈ μ μλ€.
void update(NumberGenerator generator);
... (νν)
void update(NumberGenerator generator, int number);
... (2)
void update(int number);
... (3)
(2)
λΆν°λSubject
μ λν΄ ννΈ μ 보λ₯Ό λ겨 μ€λ€.- μ΄λ‘μ¨
Observer
λSubject
λ‘λΆν° μ 보λ₯Ό μ»μ΄ μ€λ μκ³ λ₯Ό λ μ μλ€. - λ€λ§ μ΄λ¬ν ννΈ μ 보λ₯Ό μ€λ€λ κ²μ
Subject
κ°Observer
μ μ²λ¦¬ λ΄μ©μ μμνκ³ μλ€λ κ²μ΄λ€. - μ΄λ μ λμ ννΈ μ 보λ₯Ό μ λ¬ν κ²μΈμ§λ νλ‘κ·Έλ¨μ 볡μ‘μ±μ μ κ³ λ €ν΄μ νλ¨ν΄μΌ νλ€.
(3)
μ κ²½μ° νλμObserver
κ° μ¬λ¬Subject
λ₯Ό κ΄μ°°νλ κ²½μ°μλ λμ΄μ¨ μ«μκ° μ΄λSubject
μ μ 보μΈμ§ λͺ¨λ₯΄κΈ° λλ¬Έμ λΆμ μ νλ€.
κ΄μ°°νκΈ°λ³΄λ€ μ λ¬ λ°κΈ°λ₯Ό κΈ°λ€λ¦°λ€.
- κ΄μ°°μκ° λ₯λμ μΌλ‘ κ΄μ°°νλ κ²μ΄ μλλΌ, κ΄μ°° λμμμ ν΅λ³΄λ₯Ό μλμ μΌλ‘ κΈ°λ€λ¦°λ€λ μ μμ
Publish-Subscribe
ν¨ν΄μΌλ‘ λΆλ¦¬κΈ°λ νλ€. publish
μsubscribe
λΌλ ννμ΄ λ μ€μ²΄μ λ§μμ§λ λͺ¨λ₯Έλ€.
Model
/ View
/ Controller
(MVC
)
MVC
ꡬ쑰μμModel
κ³ΌView
μ κ΄κ³λObserver
ν¨ν΄μSubject
μObserver
κ΄κ³μ λμνλ€.Model
μ κ²½μ° νμ νμμ μμ‘΄νμ§ μλ λ΄λΆ λͺ¨λΈμ μ‘°μνλ€λ μ μμ,View
μ κ²½μ° μ΄λ»κ² λ³΄μ¬ μ€μ§ κ΄λ¦¬νλ μ μμ κ·Έλ¬νλ€.- μΌλ°μ μΌλ‘ νλμ
Model
μ μ¬λ¬View
κ° λμνλ€.
This post is licensed under CC BY 4.0 by the author.