본문 바로가기
자바

디자인 패턴 5. 옵저버 패턴 (Observer Patern)

by 호놀롤루 2022. 3. 12.

1. 개요

옵저버 (관찰자) 패턴은 변화가 일어났을 때, 미리 등록된 다른 클래스에 통보해주는 패턴이다.

 

많이 보이는 곳은 event listener (swing, Android 등에서 사용)에서 해당 패턴을 사용한다.

 

 

2. 코드

 

package com.company.design.observer;

public interface IButtonListener {
    void clickEvent(String event);
}

 

package com.company.design.observer;

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;
    }

}

버튼은 name과 리스너를 가진다.

click() 메소드를 실행하면 아직 구현하지 않은 리스너의 clickEvent 메소드가 실행된다.

 

addListener() 메소드는 매개변수로 리스너를 집어넣으면 버튼 안에 매개변수인 리스너를 대입한다.

package com.company.design.observer;

public class Main {
    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");

    }
}

메인에서 버튼을 생성하고, addListener에 인스턴스로 생성한 리스너를 넣어준다.

 

그리고 버튼을 click하면 리스너의 clickEvent가 실행되는데 아직 구현을 안했으니 메인에서 구현한다.

 

매개변수로 event를 받고, 그 이벤트를 sout으로 출력하는 메소드로 만들었다.

 

결과 버튼에서 click하게 되면 매개변수로 들어간 문자열이 출력된 것을 볼 수 있다.

 

이걸 활용해서 이벤트가 일어났을 때, 원하는 형식으로 전달하는 방식으로 사용한다.

댓글