μ΅μ λ² ν¨ν΄(Observer Pattern)
λ§μ½ μ μ μ κ²μ λ¨Έλκ° μ λ°μ΄νΈλμ΄ UI, μ΄λ²€νΈ λ± λ€λ₯Έ μ€λΈμ νΈμ λ³κ²½μ΄ νμνλ€λ©΄ μ΄λ»κ² ꡬνν κ²μΈκ°? λ§€λ² λ€λ₯Έ μ€λΈμ νΈκ° κ²μ λ¨Έλ μ λ°μ΄νΈκ° λλμ§ νμΈν μ μμ κ²μ΄λ€.
μ΄λ΄ λ νμν κ²μ΄ μ΅μ λ² ν¨ν΄μ΄λ€. Sudject(κ²μ λ¨Έλ)λ‘λΆν° μ΄λ ν λ³νκ° μκΈ΄λ€λ©΄, Observerλ μ΄ λ³νλ₯Ό κ°μ§ν μ μλ€.
- κ°μ²΄μ μν λ³νλ₯Ό κ΄μ°°νλ κ΄μ°°μ(μ΅μ λ²)κ° μλ€. κ΄μ°°μλ₯Ό κ°μ²΄κ° κ°κ³ μλ€κ° μν λ³νκ° μμ λ λ©μλ λ±μ ν΅ν΄ κ°μ²΄κ° κ° μ΅μ λ²μκ² ν΅μ§νλ€.
- μ£Όλ‘ λΆμ° μ΄λ²€νΈ νΈλ€λ§ μμ€ν μ ꡬννλ λ° μ¬μ©λλ€.
μ¬κΈ°μ ν΅μ¬μ κ°μ²΄μ μν λ³νλ₯Ό κ΄μ°°νλ κ²μΈλ°, κ³Όμ° μ΄λ»κ² κ΄μ°°νλ€λ κ²μΌκΉ?
1. ꡬν
1) Observer
- ConcreteObserverλ Observerμ ꡬν체μ΄λ€.
- notify()κ° νΈμΆλλ©΄ Subjectλ‘λΆν° μν λ³νκ° μλ€λ μλ¦Όμ λ°μ κ²μ΄λ€.
public interface Observer {
void notify();
}
public class ConcreteObserver implements Observer {
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject) {
this.subject = subject;
}
@Override
public void notify() {
System.out.println("value : " + subject.getValue());
}
}
2) Subject
- Subjectμ ꡬν체λ μν λ³νκ° λ°μνλ μ€λΈμ νΈμ΄λ€.
- κΈ°λ³Έμ μΌλ‘ λμμν€λ λ©μλ μΈμ μ΅μ λ²λ₯Ό λ±λ‘νλ λ©μλ(registerObserver())μ μ΅μ λ²μκ² μν λ³νλ₯Ό μ리λ λ©μλ(notifyObservers())λ₯Ό κ°μ§κ³ μλ€.
- μν λ³νκ° μλ€λ©΄ μ΅μ λ²μκ² notifyObservers()λ‘ μν λ³νκ° μμμ μλ¦°λ€.
public class Subject {
private List<Observer> observers;
private int value;
public Subject() {
observers = new ArrayList();
}
public int getValue() {
return value;
}
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void unregisterObserver(Observer observer) {
if (observers.indexOf(observer) > -1) {
observers.remove(observer);
}
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.notify();
}
}
}
3) λ€λ₯Έ ꡬν λ°©λ²
νμ¬λ ConcreteSubject subjectλ‘ Subjectλ₯Ό μ μΈνμ¬ κ°μ μ§μ κ°μ Έμ€λ λ°©μμ μ¬μ©νκ³ μμ§λ§ notify()λ₯Ό νΈμΆν λ μν λ³νμ λν κ°μ ν¨κ» μ λ¬νλ λ°©λ²λ μλ€. μλ₯Ό λ€μ΄ GUI νλ‘κ·Έλλ°μμλ λ§μ°μ€ ν΄λ¦, μ΄λ, ν€ μ λ ₯ λ± μ¬λ¬ κ°μ§ μ΄λ²€νΈλ₯Ό λ°μ΄ν° ν΄λμ€μ ννλ‘ EventListenerλ₯Ό μ λ¬νλ€.
2. μ°Έκ³
https://seolin.tistory.com/127?category=861285