본문 바로가기
Java

옵저버 패턴 (Observer pattern) 이란?

by 승화니' 2021. 5. 23.

 

Observer pattern UML Diagram

 

옵서버 패턴(observer pattern)은 객체상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통보하도록 하는 디자인 패턴 입니다.

 

주로 스윙(Swing)과 같은 GUI 프로그래밍과 안드로이드 프로그래밍할 때, 이벤트 리스너 달 때 위와 같은 옵저버 패턴의 표준적인 예로 들 수 있으며, 특정한 이벤트가 발생했을 때 리스너로 통해 전달이 되는 형태입니다. 

 

그러면, 특정 이벤트를 주었을 때 어떻게 이벤트가 전달이 되는지 아래의 코드로 설명해 드리겠습니다.

 

첫 번째. 리스너 만들기.

public interface IButtonListener {

    void clickEvent(String event);

}

 

IButtonListener라는 interface를 만들어 주고, 무언가 클릭이 이루어질 수 있는 clickEvent라는 메서드를 들어줍니다. clickEvent는 이벤트로부터 리스너를 전달받을 수 있는 메서드입니다.

 

두 번째. 버튼 만들기.

public class Button {

    private String name;
    private IButtonListener buttonListener;

    public Button(String name) {
        this.name = name;
    }

    public void click(String message) {
        buttonListener.clickEvent(message);
    }

    public void addListener(IButtonListener buttonListener) {
        this.buttonListener = buttonListener;
    }

}

 

Button이라는 Class를 생성하시고, 전역 변수에 name과 buttonListener를 구성합니다.

약간 GUI 환경과 비슷한 예로 만들기 위해 생성자(Button)는 이름을 받도록 만들어 주시고, click 했을 때 메시지를 받는 click 메서드는 메시지를 받아 buttonListener의 clickEvent로 전달받게 구성하고, 끝으로 addListener라는 메서드를 만들어 줍니다.

 

세 번째. 구현.

public class observerMain {

    public static void main(String[] args) {

        Button button = new Button("버튼");

        button.addListener(new IButtonListener() {
            @Override
            public void clickEvent(String event) {
                System.out.println(event);
            }
        });

        button.click("메시지 전달 : click 1");
        button.click("메시지 전달 : click 2");
        button.click("메시지 전달 : click 3");
        button.click("메시지 전달 : click 4");
        button.click("메시지 전달 : click 5");

    }

}

 

main 메서드에 Button 객체를 생성해 주시고, 그 아래 리스너를 달기 위해 button.addListener 메서드에 IButtonListener()를 람다로 전달받을 수 있게 구성합니다.

그리고 이벤트가 발생할 때 로그로 직접 확인할 수 있게 System.out.println(event);를 걸어 둡니다.

 

마지막으로 button.click라는 가상의 버튼을 5개를 만들어 구현합니다.

 

 

이로써 버튼을 클릭했을 때 내부의 리스너로 통해 clickEvent 메서드로 전달돼서 로그가 찍히는 것을 보실 수 있습니다.

 

위와 관련된 코드는 
https://github.com/lsh955/java_design_pattern/tree/master/src/com/company/design/observer 에서 확인하실 수 있습니다.
 

lsh955/java_design_pattern

Contribute to lsh955/java_design_pattern development by creating an account on GitHub.

github.com

 

 

 

 

 

 

'Java' 카테고리의 다른 글

어댑터 패턴 (Adapter pattern) 이란?  (2) 2021.05.19
싱글턴 패턴 (Singleton pattern) 이란?  (0) 2021.05.05

댓글