요약: Observable 객체가 Observer 객체들에게 자신의 상태 변화가 있을때 알려주는 패턴, Observable 객체의 변화가 있을때, 직접 Observable 객체가 Observable 객체에 등록된 Observer 객체들에게 직접 알려주기 위해 설계된 패턴이다.
샘플 코드 : Observable (Youtube, AfreecaTV, Twitch... ), Observer (구독자) 인 상황으로 작성해봤다. (Java Code)
public interface Observable {
void subscribe(Observer observer); // 구독
void unsubscribe(Observer observer); // 구독 해제
void alarm(); // 알림
}
Observable interface는 구독, 구독해제, 알림에 관한 코드를 구현해야 한다.
public interface Observer {
void subscribe(Observable observable);
void unsubscribe(Observable observable);
void task();
}
Observer interface는 구독, 구독해제, 알림이 왔을때 실행하는 코드를 구현해야 한다.
import java.util.ArrayList;
import java.util.List;
public class Youtube implements Observable {
private List<Observer> observerList;
public Youtube () {
this.observerList = new ArrayList<>();
}
@Override
public void subscribe(Observer observer) {
this.observerList.add(observer);
}
@Override
public void unsubscribe(Observer observer) {
this.observerList.remove(observer);
}
@Override
public void alarm() {
this.observerList.forEach(Observer::task);
}
}
Observable 구현체인 Youtube 클래스 이다. unsubscribe 메소드는 편의상 remove(Object object) 를 사용했는데, 실제로는 정확한 remove 로직을 구현해야한다.
public class Subscriber implements Observer {
private String nickname;
public Subscriber (String nickname) {
this.nickname = nickname;
}
@Override
public void subscribe(Observable observable) {
observable.subscribe(this);
}
@Override
public void unsubscribe(Observable observable) {
observable.unsubscribe(this);
}
@Override
public void task() {
String text = String.format("nickname: %s", nickname);
System.out.println(text);
}
}
Observer 구현체인 Subscriber(구독자) 클래스 이다. 구독자는 자기가 구독할 것(ex: Youtube, Twitch..)을 선택할 수 있고, 구독했던것중 일부를 구독해제 할 수 있고, 알림이오면 실행할 메소드를 정의할 수 있다.
public class Executor {
public static void main(String[] args) {
Observable youtube = new Youtube();
Observer user1 = new Subscriber("user1");
Observer user2 = new Subscriber("user2");
Observer user3 = new Subscriber("user3");
user1.subscribe(youtube);
user2.subscribe(youtube);
user3.subscribe(youtube);
youtube.alarm();
user2.unsubscribe(youtube);
youtube.alarm();
}
}
메인 클래스 이다.
Youtube 객체가 만들어 지고, user1, user2, user3 이 Youtube를 구독하고,
Youtube가 알림을 구독자들에게 보낸다.
user2가 구독해제를 하고, Youtube가 알림을 보내는 상황을 작성한 클래스 이다.
'Design Pattern' 카테고리의 다른 글
2. Decorator Pattern (0) | 2020.05.07 |
---|