본문 바로가기
SPRING

옵저버 패턴이란?

by ZZON90 2022. 4. 1.

 디자인 패턴 중 하나인 옵저버 패턴에 대해 포스팅합니다.

 

목차

  • 옵저버 패턴이란?
  • 옵저버 패턴 예제

 

 

옵저버 패턴이란?

 옵저버는 뜻 그대로 관찰자를 의미합니다. 옵저버 패턴은 어떤 변화가 발생했을 때, 미리 등록된 다른 클래스에서 변화를 통보해주는 패턴을 구현한 것입니다. 옵저버 패턴을 많이 사용하는 곳이 바로 event listener입니다. 특정한 이벤트가 발생하면 event listener를 통해 이벤트를 전달하게 됩니다.

 현실에서는 군대에 있는 당직을 생각하시면 될 것 같습니다. 당직 근무시 어떤 상황에 변화가 생겼을 때 본인이 처리하지 않고 처리 가능한 곳에 상황을 전파합니다. 당직으로부터 상황을 전달받으면 처리 가능한 곳에서 해당 상황을 처리하게 됩니다.

 

 

옵저버 패턴 예제

 옵저버 패턴은 버튼을 클릭했을 때의 반응을 예제로 하겠습니다. 인터넷이나 스마트폰을 하게 되면 어떤 동작을 하게 되는 버튼들이 있는데요. 버튼을 클릭했을 때 어떻게 이벤트를 전달하는지 확인해보겠습니다.

 

버튼 리스너 인터페이스

 버튼 리스너 인터페이스는 버튼의 이벤트를 전달해주는 인터페이스입니다. 다양한 이벤트들이 있겠지만 간단한게 clickEvent만 있다고 가정합니다. clickEvent는 클릭이 발생했을 때 이벤트를 전달받도록 설계되었습니다.

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

 

버튼 클래스

 버튼 클래스는 버튼의 이름인 name과 리스너인 buttonListener를 변수로 갖습니다. 버튼 생성시 이름을 전달받아 이름을 지정할 것이고 addListener 메서드를 통해 buttonListener를 지정해줍니다. click 메서드는 message를 전달받아 buttonListener에 clickEvent를 실행합니다.

public class Button {
	private String name;
	private IButtonListener buttonListener;
	
	public Button(String name) {
		this.name = name;
	}
	
	public void addListener(IButtonListener iButtonListener) {
		this.buttonListener = iButtonListener;
	}
	
	public void click(String message) {
		buttonListener.clickEvent(message);
	}
}

 

Main Class

 이제 버튼을 생성 후 각 이벤트에 맞게 클릭해 보겠습니다. 버튼 하나를 Button1 이라는 이름으로 생성합니다. 이제 button1의 이름은 Button1이 될 것이고요. button1의 addListener를 사용하여 ButtonListener를 지정합니다. 아래 예제에서는 익명 클래스를 사용하여 주입 시 clickEvent를 정의하도록 하겠습니다.

 clickEvent 구현시 event를 전달받아 event를 출력하도록 구현했습니다. 그 후 button1을 클릭하면 클릭할 때마다 지정한 메시지를 출력하는 것을 확인할 수 있습니다.

public class ObserverMain {
	public static void main(String[] args) {
		Button button1 = new Button("Button1");
		button1.addListener(new IButtonListener() {
			@Override
			public void clickEvent(String event) {
				System.out.println(event);
			}
		});
		button1.click("메시지 전달 : click 1");
		button1.click("메시지 전달 : click 2");
		button1.click("메시지 전달 : click 3");
		button1.click("메시지 전달 : click 4");
	}
}
=> 실행결과
메시지 전달 : click 1
메시지 전달 : click 2
메시지 전달 : click 3
메시지 전달 : click 4

 

댓글