옵저버 패턴이란 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 말합니다.
아래 예에서는 Subject의 세 명의 구독자를 만들고 Observer 유형의 메시지 게시자가 있습니다.
게시자는 구독하거나 연결된 모든 관찰자에게 주기적으로 메시지를 게시하고 업데이트된 메시지를 출려합니다.
Subject 인터페이스
public interface Subject
{
public void attach(Observer o);
public void detach(Observer o);
public void notifyUpdate(Message m);
}
MessagePublisher 클래스
public class MessagePublisher implements Subject {
private List<Observer> observers = new ArrayList<>();
@Override
public void attach(Observer o) {
observers.add(o);
}
@Override
public void detach(Observer o) {
observers.remove(o);
}
@Override
public void notifyUpdate(Message m) {
for(Observer o: observers) {
o.update(m);
}
}
}
Observer 인터페이스 및 3명의 구독자 클래스들
public interface Observer
{
public void update(Message m);
}
MessageSubscriberOne.java
public class MessageSubscriberOne implements Observer
{
@Override
public void update(Message m) {
System.out.println("MessageSubscriberOne :: " + m.getMessageContent());
}
}
MessageSubscriberTwo.java
public class MessageSubscriberTwo implements Observer
{
@Override
public void update(Message m) {
System.out.println("MessageSubscriberTwo :: " + m.getMessageContent());
}
}
MessageSubscriberThree.java
public class MessageSubscriberThree implements Observer
{
@Override
public void update(Message m) {
System.out.println("MessageSubscriberThree :: " + m.getMessageContent());
}
}
Message 클래스
public class Message
{
final String messageContent;
public Message (String m) {
this.messageContent = m;
}
public String getMessageContent() {
return messageContent;
}
}
Main 클래스
public class Main
{
public static void main(String[] args)
{
MessageSubscriberOne s1 = new MessageSubscriberOne();
MessageSubscriberTwo s2 = new MessageSubscriberTwo();
MessageSubscriberThree s3 = new MessageSubscriberThree();
MessagePublisher p = new MessagePublisher();
p.attach(s1);
p.attach(s2);
p.notifyUpdate(new Message("First Message")); //s1 and s2 will receive the update
p.detach(s1);
p.attach(s3);
p.notifyUpdate(new Message("Second Message")); //s2 and s3 will receive the update
}
}
다음과 같은 결과가 출력됩니다.
MessageSubscriberOne :: First Message
MessageSubscriberTwo :: First Message
MessageSubscriberTwo :: Second Message
MessageSubscriberThree :: Second Message
주체와 관찰자가 느슨하게 연결된 시스템을 만듭니다. 서로 명식적으로 알 필요가 없기 때문에 언제든지 독립적으로 관찰자를 추가하거나 제거할 수 있습니다. 또한 상태가 변화한 것을 감시하고 있는 객체들에게 직접 알리는 것이 아니기 때문에 불필요한 코드를 줄이는 효과가 있습니다.