Observer Design [옵저버(관찰자) 디자인]

  1. Design Object [디자인목적]

    1. 객체의 상태변화를 다른 객체에 알리고자 할 때, 적용가능
    2. 상태가 변하는 주체에 Listener를 달아 특정 상태 변화 시 Listener 객체에 상태변화를 알림.
    3. 별도의 Listener 작업[크론탭, 배치잡] 을 통하지 않고, OOP를 지키면서 설계가
  2. Options [대안들]

  3. Benefit [디자인 장점]

    1. OOP를 유지하며, Listener 제작 가능
  4. Structure & Sample Code [구조와 샘플코드]

    1) 버튼클릭과 이벤트 발

    1. UML

    2. 구조

      -> Subject 객체 : 추상클래스

      1. 상태변화를 일으킬 객체의 추상클래스

      2. 리스너 부착 / 해제 에 대한 선언

      3. 변경 시 이벤트 선언

      -> Observer 객체 : 인터페이스

      1. 상태변경에 대한 동작 부 선언
  5. Source code

  6. 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");
    }
}

results matching ""

    No results matching ""