JAVA

[Java] Observer Pattern

lakelight 2022. 8. 1. 19:33
728x90
반응형

Observer Pattern

감시자로써 역할을 합니다. 객체를 감시하다가 이벤트나, 변화가 일어 났을 때, 미리 등록된 다른 클래스에 통보해주는 패턴을 구현한 것입니다. 이 패턴은 Event Listener에서 많이 사용하고 있습니다.

이미지 출처: https://velog.io/@proshy/옵저버-패턴으로-바닐라JS-상태관리하기

 

Observer Pattern 구현

[ButtonListener interface]

package Java.observerPattern;

public interface ButtonListener {
    void clickEvent(String event);
}
ButtonListener를 만들어서 clickEvent가 생길 때 event를 어떻게 처리할지에 대한 메서드를 정의하였고, Main 메서드에서 clickEvent를 구현할 것입니다.

 

[Button class]

package Java.observerPattern;

public class Button {

    private String name;
    private ButtonListener buttonListener;

    public String getName() {
        return name;
    }

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

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

    public void addButtonListener(ButtonListener buttonListener){
        this.buttonListener = buttonListener;
    }
}
Button class 에서는 ButtonListener를 필드변수로 갖습니다. 어떤 버튼에서 이벤트가 발생했는지 알기위해 이름을 필드 변수로 갖고 출력해주는 get메서드를 생성하였습니다.
그리고 Button이 클릭되었을 때 필드 변수로 갖고 있던 ButtonListener에서 clickEvent가 호출되도록 하였습니다.
또한 Button에 ButtonListener를 추가해주는 메서드도 추가하였습니다.

 

[ObserverMain class]

package Java.observerPattern;

public class ObserverMain {
    public static void main(String[] args) {
        Button buttonA = new Button("A Button");
        Button buttonB = new Button("B Button");

        buttonA.addButtonListener(new ButtonListener() {
            @Override
            public void clickEvent(String event) {
                System.out.println(buttonA.getName()+": "+event);
            }
        });

        buttonB.addButtonListener(new ButtonListener() {
            @Override
            public void clickEvent(String event) {
                System.out.println(buttonB.getName()+": "+event);
            }
        });

        buttonA.click("Message Send: click001");
        buttonA.click("Message Send: click002");
        buttonB.click("Message Send: click003");
        buttonB.click("Message Send: click004");
    }
}
Main에서는 ButtonA와 ButtonB의 객체를 만들고 ButtonListener를 각각 추가해주었습니다. 그리고 익명객체로 생성하여 내부에서 동작하는 부분을 설정해주었습니다.
그리고 각각의 버튼이 눌렀을 때 이벤트를 출력하도록 했고, 결과는 아래와 같습니다.

 

결과

A Button: Message Send: click001
A Button: Message Send: click002
B Button: Message Send: click003
B Button: Message Send: click004

 

결론

Observer Pattern에 대해 알게되었습니다.
버튼에 리스너를 설정해주고 버튼을 감시하고 있다가 
그 버튼이 클릭이 될 때마다 메인에서 로그가 출력되도록하였습니다. 

간단한 예제로 실습을 하면서 웹 프로그래밍을 공부하였을 때
EventListener가 어떻게 동작하는지 알게되었습니다. 그리고
백엔드 파트 실무에서는 어떻게 옵저버 패턴이 사용되는지
궁금했습니다.

728x90
반응형

'JAVA' 카테고리의 다른 글

[Java] Reflection  (0) 2022.08.24
[Java] Facade Pattern  (0) 2022.08.01
[Java] Decorator Pattern - Example Car  (0) 2022.08.01
[Java] Proxy Pattern - AOP  (0) 2022.07.31
[Java] Proxy Pattern  (0) 2022.07.31