πΎ [CS] μ΅μ λ² ν¨ν΄(Observer pattern).
- μ΅μ λ² ν¨ν΄(observer pattern)μ μ£Όμ²΄κ° μ΄λ€ κ°μ²΄(subject)μ μν λ³νλ₯Ό κ΄μ°°νλ€κ° μν λ³νκ° μμ λλ§λ€ λ©μλ λ±μ ν΅ν΄ μ΅μ λ² λͺ©λ‘μ μλ μ΅μ λ²λ€μκ² λ³νλ₯Ό μλ €μ£Όλ λμμΈ ν¨ν΄μ λλ€.
- μ¬κΈ°μ 주체λ κ°μ²΄μ μν λ³νλ₯Ό λ³΄κ³ μλ κ΄μ°°μμ΄λ©°, μ΅μ λ²λ€μ΄λ μ΄ κ°μ²΄μ μν λ³νμ λ°λΌ μ λ¬λλ λ©μλ λ±μ κΈ°λ°μΌλ‘ βμΆκ° λ³ν μ¬νβμ΄ μκΈ°λ κ°μ²΄λ€μ μλ―Έν©λλ€.
- λν, μμ κ·Έλ¦Όμ²λΌ 주체μ κ°μ²΄λ₯Ό λ°λ‘ λμ§ μκ³ μνκ° λ³κ²½λλ κ°μ²΄λ₯Ό κΈ°λ°μΌλ‘ ꡬμΆνκΈ°λ ν©λλ€.
- μ΅μ λ² ν¨ν΄μ νμ©ν μλΉμ€λ‘λ νΈμν°κ° μμ΅λλ€.
- μμ κ·Έλ¦Όμ²λΌ λ΄κ° μ΄λ€ μ¬λμΈ μ£Όμ²΄λ₯Ό βνλ‘μ°β νλ€λ©΄ μ£Όμ²΄κ° ν¬μ€ν μ μ¬λ¦¬κ² λλ©΄ μλ¦Όμ΄ βνλ‘μβμκ² κ°μΌν©λλ€.
- λν, μ΅μ λ² ν¨ν΄μ μ£Όλ‘ μ΄λ²€νΈ κΈ°λ° μμ€ν
μ μ¬μ©νλ©° MVC(Model-View-Controller) ν¨ν΄μλ μ¬μ©λ©λλ€.
- μλ₯Ό λ€μ΄ 주체λΌκ³ λ³Ό μ μλ λͺ¨λΈ(model)μμ λ³κ²½ μ¬νμ΄ μ겨 update() λ©μλλ‘ μ΅μ λ²μΈ λ·°μ μλ €μ£Όκ³ μ΄λ₯Ό κΈ°λ°μΌλ‘ 컨νΈλ‘€λ¬(controller) λ±μ΄ μλνλ κ²μ λλ€.
1οΈβ£ μλ°μμμ μ΅μ λ² ν¨ν΄.
// Observer
public interface Observer {
void update();
}
// Subject
public interface Subject {
void register(Observer obj);
void unregister(Observer obj);
void notifyObservers();
Object getUpdate(Observer obj);
}
// Topic
import java.util.ArrayList;
import java.util.List;
public class Topic implements Subject {
private List<Observer> observers;
private String message;
public Topic() {
this.observers = new ArrayList<>();
this.message = "";
}
@Override
public void register(Observer obj) {
if (!observers.contains(obj)) {
observers.add(obj);
}
}
@Override
public void unregister(Observer obj) {
observers.remove(obj);
}
@Override
public void notifyObservers() {
this.observers.forEach(Observer::update);
}
@Override
public Object getUpdate(Observer obj) {
return this.message;
}
public void postMessage(String msg) {
System.out.println("Message sended to Topic: " + msg);
this.message = msg;
notifyObservers();
}
}
// TopicSubscriber
public class TopicSubscriber implements Observer {
private String name;
private Subject topic;
public TopicSubscriber(String name, Subject topic) {
this.name = name;
this.topic = topic;
}
@Override
public void update() {
String msg = (String) topic.getUpdate(this);
System.out.println(name + ":: got message >> " + msg);
}
}
// Main
public class Main {
public static void main(String[] args) {
Topic topic = new Topic();
Observer a = new TopicSubscriber("a", topic);
Observer b = new TopicSubscriber("b", topic);
Observer c = new TopicSubscriber("c", topic);
topic.register(a);
topic.register(b);
topic.register(c);
topic.postMessage("nice to meet you");
}
}
μ€ν κ²°κ³Ό
Message sended to Topic: nice to meet you
a:: got message >> nice to meet you
b:: got message >> nice to meet you
c:: got message >> nice to meet you
-
topic
μ κΈ°λ°μΌλ‘ μ΅μ λ² ν¨ν΄μ ꡬννμ΅λλ€.- μ¬κΈ°μ
topic
μ 주체μ΄μ κ°μ²΄κ° λ©λλ€.-
class Topic implements Subject
λ₯Ό ν΅ν΄Subject interface
λ₯Ό ꡬννκ³Observer a = new TopicSubscriber("a", topic);
μΌλ‘ μ΅μ λ²λ₯Ό μ μΈν λ ν΄λΉ μ΄λ¦κ³Ό μ΄λ ν ν ν½μ μ΅μ λ²κ° λ κ²μΈμ§λ₯Ό μ νμ΅λλ€.
-
- μ¬κΈ°μ
μλ°: μμκ³Ό ꡬν
- μμ μ½λμ λμ¨
implements
λ± μλ°μ μμκ³Ό ꡬνμ νΉμ§κ³Ό μ°¨μ΄μ λν΄ μμλ³΄κ² μ΅λλ€.-
μμ(extends)
- μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μ λ©μλ λ±μ μμλ°μ μ¬μ©νλ©° μμ ν΄λμ€μμ μΆκ° λ° νμ₯μ ν μ μλ κ²μ λ§ν©λλ€.
- μ΄λ‘ μΈν΄ μ¬μ¬μ©μ±, μ€λ³΅μ±μ μ΅μνκ° μ΄λ£¨μ΄μ§λλ€.
- μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μ λ©μλ λ±μ μμλ°μ μ¬μ©νλ©° μμ ν΄λμ€μμ μΆκ° λ° νμ₯μ ν μ μλ κ²μ λ§ν©λλ€.
-
ꡬν(Implements)
- λΆλͺ¨ μΈν°νμ΄μ€(Interface)λ₯Ό μμ ν΄λμ€μμ μ¬μ μνμ¬ κ΅¬ννλ κ²μ λ§ν©λλ€.
- μμκ³Όλ λ¬λ¦¬ λ°λμ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ¬μ μνμ¬ κ΅¬νν΄μΌ ν©λλ€.
- λΆλͺ¨ μΈν°νμ΄μ€(Interface)λ₯Ό μμ ν΄λμ€μμ μ¬μ μνμ¬ κ΅¬ννλ κ²μ λ§ν©λλ€.
-
μμκ³Ό ꡬνμ μ°¨μ΄
- μμμ μΌλ° ν΄λμ€,
abstract
ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ ꡬννλ©°, ꡬνμ μΈν°νμ΄μ€λ₯Ό κΈ°λ°μΌλ‘ ꡬνν©λλ€.
- μμμ μΌλ° ν΄λμ€,
-
μμ(extends)