[디자인패턴]옵저버 패턴 응용

gov's avatar
Nov 14, 2024
[디자인패턴]옵저버 패턴 응용
Contents
출력
💡
옵저버 패턴 흐름을 스레드로 처리하는 방식
옵저버 패턴은 상태 변화 시 구독자들에게 알림. 스레드는 알림을 비동기적 처리
비동기적 처리: 작업이 완료되기를 기다리지 않고 다른 작업을 동시에 진행

응용

  • while 문: 옵저버가 상품 입고와 같은 상태 변화를 실시간 체크
  • 옵저버 패턴 활용해 주체 변화전까지 대기 스레드로 대기해 실제 상태 변화를 비동기적 처리, 상품 입고 시 바로 알림
package ch08; import ch08.pub.Pub; import ch08.sub.Sub1; import ch08.sub.Sub2; import ch08.sub.SubListener; // OS에 스레드 요청 > run을 때림 > 다하면 스레드 생명주기 종료 public class App { public static void main(String[] args) { // 메인 스레드 // 1. 객체 생성 init -최초 등록 시 모든 필요 객체 등록됨 Pub pub = new Pub(); SubListener sub1 = new Sub1(); SubListener sub2 = new Sub2(); pub.add(sub1); pub.add(sub2); // 2. 마트 상품 입고 스레드 new Thread(()->{ try { Thread.sleep(10000); } catch (InterruptedException e) { throw new RuntimeException(e); } pub.income(); // 상품 들어옴 }).start(); // 3. 마트 스레드 new Thread(()->{ while (true) { // while 옵저버 응용 -연결이 끊기면 안된다 if (pub.value == null) { System.out.println("상품 미입고.."); } else { pub.notifyChange(pub.value + "입고됨"); break; // 입고 시 종료 } try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } }).start(); } }
package ch08.pub; import ch08.sub.SubListener; import java.util.ArrayList; import java.util.List; public class Pub { public String value = null; public void income() { // 물건 value = "바나나"; } public List<SubListener> subList = new ArrayList<>(); public void add(SubListener sub) { subList.add(sub); } public void notifyChange(String msg) { for(SubListener sub : subList){ sub.update(msg); } } }
package ch08.sub; public class Sub1 implements SubListener { @Override public void update(String msg) { System.out.println("Sub1이 받은 알림: " + msg); } } package ch08.sub; public class Sub2 implements SubListener { @Override public void update(String msg) { System.out.println("Sub2가 받은 알림: " + msg); } } package ch08.sub; public interface SubListener { void update(String msg); }

출력

notion image
 
Share article

goho