1. 옵저버 패턴
1)옵저버 패턴이란
-객체의 상태 변화를 관찰하는 관찰자인 옵저버들을 등록해서 객체의 상태 변화가 있을 때마다
메서드 등을 통해 옵저버들에게 통지하도록 하는 디자인 패턴
-유튜브로 예시를 들면 내가 원하는 유튜브 채널을 구독 및 알림설정을 해서 유튜버가 영상을 올릴 때마다
알림이 뜨는 것을 예로 들 수 있다.
-이 때의 유튜브 채널은 주제 객체(관찰객체) 구독자는 옵저버에 해당한다. 그래서 유튜버가 영상을 올림으로써
채널에 변화가 일어난다면 등록된 구독자에게 알림이 간다.
2)버튼 클릭을 예로 들었을 때
2-1) 구현요소
-1)옵저버
-이벤트를 수신하는 역할
-2)주제객체(관찰객체)
-상태변화가 일어나면 이벤트를 옵저버에 송신하는 역할
-인터페이스를 구현해야 주제객체가 보낸 이벤트를 받을 수 있음.
-3)옵저버 인터페이스
-옵저버 클래스가 주제객체(관찰객체)의 이벤트를 받기위한 인터페이스
2-2)전체 코드
- 현재 예시코드는 안드로이드 스튜디오가 아닌 인텔리제이에서 자바로 샘플 코드를 작성한 것입니다.
- 옵저버 패턴을 이용해 버튼클릭이 어떤 식으로 진행되는지 구체적으로 확인하기 위해서 작성했습니다.
- Button클래스는 관찰 객체가 되고 ButtonObserver 클래스는 Observer 인터페이스를 구현한 Observer클래스가
됩니다.
package ObserverPattern;
public class main {
public static void main(String[] args) {
Button button = new Button();
//옵저버 등록
button.addObserver(new ButtonObserver());
/* //2)옵저버를 main 클래스에서 바로 생성
button.addObserver(new Button.OnclickListener() {
@Override
public void onclick() {
System.out.println("Main");
}
});*/
//2초에 한번씩 사용자의 버튼 클릭이 발생
while (true) {
try {
Thread.sleep(2000);
button.Onclick();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//옵저버 클래스
class ButtonObserver implements Button.OnclickListener {
//listener.onclick()가 호출되면 실행
@Override
public void onclick() {
System.out.println("Override Method Call");
}
}
package ObserverPattern;
//관찰 클래스
public class Button {
//이벤트를 전달해주는 인터페이스
private OnclickListener listener;
interface OnclickListener {
//콜백 메서드(추상 메서드)
public void onclick();
}
//옵저버를 등록하는 메서드
public void addObserver(OnclickListener listener) {
this.listener = listener;
}
public void Onclick() {
//옵저버가 등록된 경우에만 실행
if (listener != null) {
System.out.println("CallBack Method Call");
//추상 메서드 호출 (콜백 메서드)
listener.onclick();
}
}
}
2-3)코드설명
//2초에 한번씩 사용자의 버튼 클릭이 발생
while (true) {
try {
Thread.sleep(2000);
button.Onclick();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
-1)main()함수의 While(true)문에서의 내용처럼 2초에 한번씩 계속해서 사용자가 버튼을 클릭해서 Button 클래스의 OnClick()메서드가 실행됩된다고 가정해보겠습니다.
//옵저버 등록
button.addObserver(new ButtonObserver());
-2)main()함수에서 addObserver()메서드를 사용해 ButtonObserver 객체를 생성해 옵저버로 등록합니다.
//관찰 클래스
public class Button {
//이벤트를 전달해주는 인터페이스
private OnclickListener listener;
interface OnclickListener {
//콜백 메서드(추상 메서드)
public void onclick();
}
//옵저버를 등록하는 메서드
public void addObserver(OnclickListener listener) {
this.listener = listener;
}
public void Onclick() {
//옵저버가 등록된 경우에만 실행
if (listener != null) {
System.out.println("CallBack Method Call");
//추상 메서드 호출 (콜백 메서드)
listener.onclick();
}
}
}
-3)사용자가 버튼을 클릭하면 Button 클래스의 OnClick()메서드가 실행되어 listener.onClick()메서드가 실행됩니다.
//옵저버 클래스
class ButtonObserver implements Button.OnclickListener {
//listener.onclick()가 호출되면 실행
@Override
public void onclick() {
System.out.println("Override Method Call");
}
}
-4)옵저버 클래스에 OnclickListener 인터페이스를 구현해서 onClick()메서드를 오버라이드 합니다.
-사용자가 버튼을 클릭하면 listener.Onclick() 메서드가 실행되어서 오버라이드한 Onclick()메서드가 실행됩니다.
-이 때 실행되는 오버라이드한 Onclick()메서드를 콜백메서드라고 얘기합니다 즉 사용자의 버튼 클릭 이벤트에 의해 호출되어지는 함수입니다.
-출력화면에 println으로 찍은 로그가 보이는 것을 확인할 수 있습니다.
참고
https://www.youtube.com/watch?v=4w4AV1HURJs
'안드로이드 공부 & 앱' 카테고리의 다른 글
안드로이드 CleanArchitecture 개념 정리 및 구현 (0) | 2022.04.21 |
---|---|
[안드로이드] JetPack Navigation 개념 정리 및 예제 (0) | 2022.04.16 |
운동친구 어플 레이아웃 설계화면 (0) | 2022.02.12 |
[안드로이드/코틀린] activityResultLauncher(ActivityForResult 대체) (0) | 2022.02.02 |
[안드로이드/코틀린] 카메라/갤러리 사진 이미지뷰에 로딩하기 (0) | 2022.01.28 |
댓글