본문 바로가기

강의/Design pattern

관찰자(Observer) 패턴

SMALL

Observer pattern

상태의 변경을 감지하고, 지켜보는 패턴. 여러 개의 객체들이 한개의 상태변화를 감지하고 반응할 때 적용한다.
pubslish - subscribe 를 구현하기에 적합하다.


Code Example

Client

public class Client {
  public static void main(String[] args) {
    ChatServer chatServer = new ChatServer();
    
    User user1 = new User(chatServer);
    user1.sendMessage("design pattern", "observer");
    user1.sendMessage("2022", "test");
    
    User user2 = nwe User(chatServer);
    
    user1.sendMessage("design pattern", "code");
  }
}

Subscriber

public interface Subscriber {
  void handleMessage(String message);
}

User

public class User implements Subscriber {
  private String name;
  
  @Override
  public void handleMessage (String meassage); {
  }
  //getter, constructor
}

ChatServer

public class ChatServer {
  private Map<String, List<Subscribe> subscribers = new HashMap<>();
  public void register(String subject, Subscriber subscriber) {
    if(subscribers.containsKey(subject)) {
      subscribers.get(subject).add(subscriber);
    } else {
      List<Subscriber> list = new ArrayList<>();
      list.add(subscriber);
      this.subscribers.put(subject, list);
    }
  }
  
  public void unregister(String subject, Subscriber subscriber) {
    if(subscribers.containsKey(subject)) {
      subscribers.get(subject).remove(subscriber);
    }
  }
  public void sendMessage (User user, String subject, String message) {
    String userMessage = user.getName() + ": " + message;
    
    if(subscribers.containsKey(subject)) {
      this.subscribers.get(subject).forEach(s -> s.handleMessage(userMessage));
    }
  }
}

Client

public class Cilent {
  public static void main(String[] args) {
    ChatServer chatServer = new ChatServer();
    User user1 = new User("user1");
    User user2 = new User("user2");
    
    chatServer.register("aaa", user1);
    chatServer.register("aaa", user2);
    chatServer.register("bbb", user1);
    
    chatServer.sendMessage(user1, "aaa", "aaa11");
    chatServer.sendMessage(user2, "bbb", "bbb11");
  }
}

장단점

장점

  • 상태를 변경하는 객체 publisher와 변경을 감지하는 객체 subscriber의 관계를 느슨하게 유지할 수 있다.
  • Subject의 상태 변경을 주기적으로 조회하지 않고 자동으로 감지할 수 있다.
  • 런타임에 옵저버를 추가하거나 제거할 수 있다.

단점

  • 복잡도가 증가한다.
  • 다수의 Observer 객체를 등록 이후 해지하지 않으면 메모리 누수가 발생할 수 있다.

Example

Observer, Observable

Java 9부터는 사용을 권장하지 않는다. 대신 PropertyChangeListener를 사용한다.

Flow

Processor, Publisher, Subscriber과 onComplete를 확장하여 사용할 수 있다.

ApplicationContext

EventPublisher 이다.

SMALL

'강의 > Design pattern' 카테고리의 다른 글

전략(Strategy) 패턴  (0) 2022.09.22
상태(State) 패턴  (0) 2022.09.22
중재자(Mediator) 패턴  (0) 2022.09.22
이터레이터(Iterator) 패턴  (0) 2022.09.22
인터프리터(Interpreter) 패턴  (0) 2022.09.22