본문 바로가기

Java SE/Observer Pattern example

Observer Design Pattern example

Observer, Observable

Observer 디자인 패턴은,  관찰대상이 되는 오브젝트의 상태가 변경되면 관찰자에게 알려서 update()메소드가 실행되는 형식이다.

자바언어에서는 Observer 디자인 패턴을 위해 Observer인터페이스와 Observable 클래스를 제공하고 있다. Observable 클래스는 관찰대상이 되는 클래스가 상속하여야 하고, Observer 인터페이스는 관찰자의 역할을 하는 클래스가 구현해야 한다.

Observable(관찰대상 오브젝트)에 Observer(관찰자 오브젝트)를 등록해 놓고, Observable의 상태가 변경될 때 Observer에게 통보하기 위해서는 setChanged(), notifyObservers() 메소드를 차례로 호출해 주면 Observer의 update()가 호출되는 구조로 되어 있다.

자바 애플리케이션을 작성하면서 MVC 구조로 프로그래밍한다면,  Model(데이터)이 변경되면 연결된 View에 알려서 화면을 갱신할 필요가 있는데, 이런 경우에 적절하게 사용할 수 있을 것이다. 즉 Model 클래스는 Observable 클래스를 상속하여 관찰대상으로 설정하고, View 클래스는 Observer 인터페이스를 구현하여 Model의 변경을 통보받고 화면을 갱신하도록 설정할 때 유용한 패턴이라고 할 수 있겠다.

관찰대상 오브젝트
MyObservable.java

package observer;

import java.util.Observable;
public class MyObservable extends Observable
{
   // 이 값이 변경되면 Observer에게 통보하도록 작성했다.
   private int n = 0;

   // 이 메소드가 호출되면 n변수의 값이 변경되면서 Observer에게 통보한다
   public void setValue(int n)
   {
      this.n = n;
      setChanged();
      notifyObservers();
      //notifyObservers(n);
      //위와같이 notifyObservers()를 호출할 때 아규먼트를 전달하면 Observer.update()메소드의 2번째 파라미터로 전달됨.
   }
}


관찰자 오브젝트
MyObserver.java

package observer;

import java.util.Observer;
import java.util.Observable;

public class MyObserver implements Observer
{
   // Observable으로부터 통보가 오면 이 메소드가 실행됨
   // Observable에서 notifyObservers()메소드에서 아규먼트를 전달하면 두번째
   // 파라미터(Object obj)로 전달된다

   public void update(Observable obs, Object obj)
   {
    System.out.println("값이 변경됨"+obj);
   }
}


테스트를 위한 main()메소드

package observer;

public class Main
{
   public static void main(String [] args)
   {
      MyObservable ov = new MyObservable(); //관찰대상 오브젝트
      MyObserver to = new MyObserver();  //관찰자 오브젝트
     
      // Observable객체에 Observer객체를 등록함
      ov.addObserver(to);
     
      //관찰대상 오브젝트의 상태를 변경한다. 그러면 연결된 Observer의 update()가 호출됨
      ov.setValue(100);
   }
}