옵서버 패턴(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 에서 확인하실 수 있습니다.
'Java' 카테고리의 다른 글
어댑터 패턴 (Adapter pattern) 이란? (2) | 2021.05.19 |
---|---|
싱글턴 패턴 (Singleton pattern) 이란? (0) | 2021.05.05 |
댓글