개념
(출처 - https://en.wikipedia.org/wiki/Observer_pattern)
옵저버 패턴은 Subject 객체가 옵저버라는 데이터 리스트를 갖고 있고, 옵저버들에게 데이터의 변경 사항을 자동으로 알려주는 패턴이다.
옵저버 패턴의 장점은 Subject와 Observer 사이에 Loose Coupling(인터페이스를 사용하므로)을 만들어준다. 이를 통해
1) 인터페이스 조건만 만족한다면, 새로운 형식의 Observer(Ex LCD 하드웨어)가 추가되더라도 상관 없다.
2) 인터페이스 조건만 만족한다면, Subject나 Observer가 바뀌어도 상관없다.
는 장점이 있어 유지보수에 유리하다.
실습
Main
| Subject server = new Subject(); Deamon deamon = new Deamon(server); server.start(); deamon.start(); | cs |
Subject
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | class Subject extends Thread{ String chageValue = "changeValue"; int i=0; List<IObserver> observers = new ArrayList<>(); public void run() { Random random = new Random(); while(true) { i++; // 등록된 observer들에게 변경 사항 알리기 for (IObserver observer : observers) { observer.noti(chageValue+" "+i); } try { // 임의의 주기 설정 Thread.sleep((random.nextInt(5) + 1) * 1000); System.out.println("[Subject] 변경 사항 전송!"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public interface IObserver { public void noti(String s); } } | cs |
Observer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Observer implements Subject2.IObserver { private String name; public Observer(String name) { super(); this.name = name; } @Override public void noti(String s) { System.out.println("[Observer "+ name +"]에 변경사항["+s+"] 반영 완료"); } public void otherMethod() { System.out.println("Observer "+ name +" 다른 동작입니다."); } } | cs |
Deamon
옵저버 패턴과는 상관없는 클래스이다. 그러나 클래스를 임의로 등록하기 위한 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | /** * 임의의 주기로 클라이언트 등록을 위한 데몬 클래스 * @author Heepie * */ class Deamon extends Thread{ Subject server; Random random; int count; public Deamon(Subject server) { this.server = server; random = new Random(); } public void run() { while(true) { count = random.nextInt(50); server.observers.add(new Observer(count+"")); try { // 주기 2초, 2초마다 Observer 생성 Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } | cs |
스크린 샷
#옵저버 패턴 #observer pattern #observer 패턴 #디자인 패턴 #면접
댓글