옵저버패턴(알림)

오민석·2021년 5월 2일
0
post-thumbnail

옵저버패턴 : 객체(주체)가 객체(옵저버)를 등록하여 객체 목록들을 유지하고, 주체에 상태 변화가 있을 때마다 메서드등을 통해 옵저버에게 통지하는 디자인패턴입니다. 알림의 주제, 데이터 등 전달할 때 필요

2가지의 방식이 있다.

  • PUSH 방식 : 주제의 내용이 변경될 때마다 구독자에게 알려주는 방식
  • PULL 방식 : 구독자가 필요할 때마다 주제에게 정보를 요청하는 방식

[Push 방식]

간단하게 Publisher는 객체 등록, 삭제, 알림을 할 수 있다. 각 인터페이스를 구현하고 클래스를 implement하여 구현한다.
Observer의 notify method는 News가 새로운 뉴스를 발간할 때 마다 notifyObserver()를 호출하며 notify가 호출된다.

Publisher 인터페이스

public interface Publisher { 
public void add(Observer observer); 
public void delete(Observer observer); 
public void notifyObserver(); 
}

Observer 인터페이스

public interface Observer { 
public void notify(String title, String news); 
}

News 클래스

public class NewsMachine implements Publisher { 
private ArrayList<Observer> observers; 
  private String title; 
  private String news; 
  
  public NewsMachine() { 
  observers = new ArrayList<>(); 
  } 
  
  @Override 
  public void add(Observer observer) { 
  observers.add(observer); 
  } 
  
  @Override 
  public void delete(Observer observer) { 
  int index = observers.indexOf(observer); 
  observers.remove(index); 
  } 
  
  @Override 
  public void notifyObserver() { 
  for(Observer observer : observers) { 
  observer.notify(title, news); 
  	} 
  } 
  
  public void setNewsInfo(String title, String news) {
  this.title = title; 
  this.news = news; 
  notifyObserver(); 
  } 
  
  public String getTitle() { 
  return title; 
  } 
  
  public String getNews() {
  return news; 
  	} 
  }

AnnualSubscriber 클래스

public class AnnualSubscriber implements Observer { 
private String newsString; 
private Publisher publisher; 

public AnnualSubscriber(Publisher publisher) { 
this.publisher = publisher; 
publisher.add(this); 
} 

@Override public void notify(String title, String news) { 
this.newsString = title + " \n -------- \n " + news; 
display(); 
}

private void display() {
System.out.println("오늘의 뉴스" + newsString); 
	} 
}

EventSubscriber 클래스

public class EventSubscriber implements Observer { 
private String newsString; 
private Publisher publisher; 

public EventSubscriber(Publisher publisher) { 
this.publisher = publisher; 
publisher.add(this); 
} 

@Override 
public void notify(String title, String news) { 
newsString = title + news; 
display(); 
} 

public void display() { 
System.out.println("이벤트 유저"); 
System.out.println("newsString); 
	} 
}

main함수

public class MainClass { 
public static void main(String[] args) { 
News news = new News(); 
AnnualSubscriber as = new AnnualSubscriber(News); 
EventSubscriber es = new EventSubscriber(News); 
newsMachine.setNewsInfo("오늘 한파", "전국 영하 18도 입니다.");  } }

출력본

단점:

  • 너무 많이 사용하게 되면, 상태 관리가 힘들 수 있다.

0개의 댓글