Observer Design [옵저버(관찰자) 디자인]
Design Object [디자인목적]
- 객체의 상태변화를 다른 객체에 알리고자 할 때, 적용가능
- 상태가 변하는 주체에 Listener를 달아 특정 상태 변화 시 Listener 객체에 상태변화를 알림.
- 별도의 Listener 작업[크론탭, 배치잡] 을 통하지 않고, OOP를 지키면서 설계가
Options [대안들]
Benefit [디자인 장점]
- OOP를 유지하며, Listener 제작 가능
Structure & Sample Code [구조와 샘플코드]
1) 버튼클릭과 이벤트 발
UML
구조
-> Subject 객체 : 추상클래스
상태변화를 일으킬 객체의 추상클래스
리스너 부착 / 해제 에 대한 선언
변경 시 이벤트 선언
-> Observer 객체 : 인터페이스
- 상태변경에 대한 동작 부 선언
Source code
Client
public class Client {
public static void main(String[] args) {
Button button = new Button();
InputText text = new InputText();
List list = new List();
button.attachObserver(text);
button.attachObserver(list);
button.clicked();
}
}
- Subject
public interface Subject {
void attachObserver(Observer observer);
void detachObserver(Observer observer);
void change();
}
- Button - Subject abstraction
import java.util.ArrayList;
public class Button implements Subject{
// List to set observers
java.util.List<Observer> observers = new ArrayList<Observer>();
// public function to fire changes
public void clicked(){
change();
}
@Override
public void attachObserver(Observer observer) {
this.observers.add(observer);
}
@Override
public void detachObserver(Observer observer) {
this.observers.remove(observer);
}
@Override
public void change() {
for (Observer observer : observers) {
observer.update();
}
}
}
- Observer
public interface Observer {
// declare function which do action on status changes
void update();
}
- List - Observer implematation
public class List implements Observer {
public void setListValue(int value){
System.out.println("Set list value : "+value);
}
@Override
public void update() {
setListValue(1);
}
}
- InputText
public class InputText implements Observer {
public void setText(String text){
System.out.println("Inputtext set text: "+text);
}
@Override
public void update() {
this.setText("button has been clicked");
}
}