티스토리 뷰

들어가는말

N/A 

요약

observer 가 관찰자라서 능동인 것처럼 느껴지지만 결국 행위를 수신하는 피동적 대상이다. (이벤트 구독)

 

능동적으로 observer 들을 관리하고 통보하는 행위는 observable (이벤트 발생) 이 수행한다.

 

observable 이 observer 들을 관리하는 건 deprecated 된 java.util.Observable에 의존할 수도 있고 list 로도 사용할 수 있다

 

사족: depreacated 된 이유는 Observable이 Serializable를 implements 하지 않은 것이랑 thread safety 가 보장되지 않는다는 것이다 (이건 잘 안 와닿기는 하는데)

뭐 거기다 9 에서는 Flow API 가 나오기도 했고

https://stackoverflow.com/questions/46380073/observer-is-deprecated-in-java-9-what-should-we-use-instead-of-it

 

Observer is deprecated in Java 9. What should we use instead of it?

Java 9 came out, and Observer has been deprecated. Why is that? Does it mean that we shouldn't implement observer pattern anymore? It would be good to know what is a better alternative?

stackoverflow.com

 

패턴에서는 observable 은 subject라는 명칭으로도 불린다. (행위 컨셉은 동일하다)

 

observer는 약속된 수신 인터페이스(콜백)를 구현하면 된다. (그럼 observable 이 사전에 정의된 대로 처리해줄 테니)

 

출처

https://www.baeldung.com/java-observer-pattern

샘플

package me.xep;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class Observer {

    //observable
    public static class NewsAgency {
        private String news;
        private List<Channel> channelList = new ArrayList<>();

        public void addObserver(Channel channel) {
            this.channelList.add(channel);
        }

        public void removeObserver(Channel channel) {
            this.channelList.remove(channel);
        }

        public void setNews(String news) {
            this.news = news;
            for (Channel channel : channelList) {
                channel.update(news);
            }
        }
    }

    //observer
    public static class NewsChannel implements Channel {
        public String news;

        public String getNews() {
            return news;
        }

        @Override
        public void update(Object news) {
            this.news = (String) news;
        }
    }

    public interface Channel {
        void update(Object o);
    }

    @Test
    public void test() {
        NewsAgency observable = new NewsAgency();
        NewsChannel observer = new NewsChannel();

        observable.addObserver(observer);
        observable.setNews("news");
        assert observer.getNews().contentEquals("news");
    }
}
package me.xep;

import org.junit.Test;

import java.util.Observable;
import java.util.Observer;

public class Observer2 {

    public static class NewsChannel implements Observer {
        private String news;

        public String getNews() {
            return news;
        }

        @Override
        public void update(Observable o, Object arg) {
            this.news = (String) arg;
        }
    }

    public static class NewsAgency extends Observable {
        private String news;

        public void setNews(String news) {
            this.news = news;
            setChanged();
            notifyObservers(news);
        }
    }

    @Test
    public void test() {
        NewsChannel observer = new NewsChannel();
        NewsAgency observable = new NewsAgency();

        observable.addObserver(observer);
        observable.setNews("news");
        assert observer.getNews().contentEquals("news");
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함