본문 바로가기
안드로이드 공부 & 앱

[안드로이드] 버튼 클릭 리스너로 확인하는 옵저버 패턴-1편

by 문톰 2022. 4. 13.

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://velog.io/@hanna2100/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-2.-%EC%98%B5%EC%A0%80%EB%B2%84-%ED%8C%A8%ED%84%B4-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%98%88%EC%A0%9C-observer-pattern

 

[디자인패턴] 2. 옵저버 패턴 개념과 예제 (observer pattern)

Head First Design Patterns 책을 보고 정리한 내용입니다. 디자인 패턴을 처음 입문하시는 분들께 추천드리고픈 책입니다. >[ 목차 ] 스트래티지 패턴 옵저버 패턴 데코레이터 패턴 팩토리 패턴 싱글턴

velog.io

https://www.youtube.com/watch?v=4w4AV1HURJs

 

댓글