Observer 패턴

5.디자인패턴 2016. 9. 16. 12:38

Observer 패턴은 관찰 대상 객체에 변경 사항이 발생했을 때 이벤트 형태로 알림을 받는 패턴이다. Push / Pool 방식의 데이터 처리 방식 중에서 Push에 해당한다. 소프트웨어에서 데이터 처리에서는 너무 자주 나타나는 패턴이기 때문에 자주 쓰이고, 그렇기 때문에 사용에 주의해야 하는 패턴이다. Observer 패턴을 너무 자주 사용하면 구조와 동작을 알아보기 힘들어진다.

일반적으로 Observer 패턴에서 관찰 대상이 되는 객체(Observerable) 한 개에 대하여 다수의 관찰자 객체(Observer)가 존재한다. 다수의 관찰자 객체들은 모두 같은 타입으로 취급되어야만 구현이 단순해진다. 따라서 관찰자들은 모두 같은 인터페이스나 상위 클래스를 상속 받아 구현된다. 관찰 대상으로부터 이벤트가 발생하여 관찰자 객체에게 전달되었을 때 이 데이터를 처리하는 내용은 개별 관찰자 객체들이 자신에 맞게 구현한다.


Observer 패턴의 클래스 다이어그램


Observer 패턴의 구현

interface IObserver{

    public void notify(Object data);

}

class Observable{

    private List<IObserver> observers = new ArrayList<IObserver>();

   

    public void registObserver(IObserver observer){ observers.add(observer); }

   

    String []table = {"a","b","c","d","e"};

    public void update(String data, int index){

        table[index] = data;

        onUpdate();

    }

    public void onUpdate(){

        for(IObserver observer : observers){

            observer.notify(table);

        }

    }

}

class Graph implements IObserver{

    public Graph(Observable obervable){ obervable.registObserver(this); }

    public void notify(Object data){

        String[] table = (String[])data;

        System.out.println("Graph : ");

        for(int i = 0; i < 5; i++) System.out.println(table[i]);

    }

}

class Display implements IObserver{

    public Display(Observable obervable){ obervable.registObserver(this); }

    public void notify(Object data){

        String[] table = (String[])data;

        System.out.println("Display : ");

        for(int i = 0; i < 5; i++) System.out.println(table[i]);

    }

} 


실행 방법

public static void main(String[] args) {

    Observable observable = new Observable();

    IObserver graph = new Graph(observable);

    IObserver display = new Display(observable);

    observable.update("abc", 1);

    observable.update("def", 2);

    observable.update("ghi", 3);

}


위의 코드에서 관찰 대상은 Observable이고, 관찰자 인터페이스는 IObserver로 선언되어 있다. 그리고 관찰자 구체 클래스는 Graph와 Display이다. 위의 코드에서는 우선 관찰 대상인 Observable 객체가 먼저 생성되어야 한다. 그리고 관찰자 객체들은 생성자에서 Observable 객체를 매개변수로 받은 후, Observable 객체에 자신을 관찰자로 등록한다.(Observable 객체에 관찰자를 등록 시키는 방법은 꼭 생성자를 이용한 방법이 아니어도 좋다.) 이후 관찰 대상에 이벤트가 발생하면 각 관찰자 객체들의 notify 함수를 통해서 발생한 이벤트를 전달해 준다.

'5.디자인패턴' 카테고리의 다른 글

Enum Abstract Factory 패턴  (0) 2016.09.16
Proxy 패턴과 그 활용  (0) 2016.09.16
Abstract Factory 패턴  (0) 2016.09.16
Factory Method 패턴  (4) 2016.09.16
Memento 패턴  (2) 2016.09.13
Posted by 이세영2
,