옵저버 패턴(Observer Pattern)

HEETAE HEO·2022년 6월 10일
0
post-thumbnail

1. 옵저버 패턴이란?

옵저버 패턴이란 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 말합니다.

2. 예제 구현

아래 예에서는 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

옵저버 패턴의 장점

주체와 관찰자가 느슨하게 연결된 시스템을 만듭니다. 서로 명식적으로 알 필요가 없기 때문에 언제든지 독립적으로 관찰자를 추가하거나 제거할 수 있습니다. 또한 상태가 변화한 것을 감시하고 있는 객체들에게 직접 알리는 것이 아니기 때문에 불필요한 코드를 줄이는 효과가 있습니다.

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글