해당 포스트는 "자바 객체지향 디자인 패턴", "JAVA 언어로 배우는 디자인 패턴 입문" 책의 내용을 요약한 것이다.
2. Observer 패턴을 JDK API를 이용하지 않고 직접 구현하는 방법
ex)
<Observer>
public interface Display { public void display(); } interface Observer{ public void update(Observable o); } class KoreanDisplay implements Observer, Display{ private Observable observable; // 등록될 Observable private float temperature; private float humidity; private float pressure; public KoreanDisplay(Observable observable) { this.observable = observable; observable.addObserver(this); //this(KoreaDisplay)를 옵저버로 등록 } @Override public void display() { System.out.println("온도 : "+temperature); System.out.println("습도 : "+humidity); System.out.println("압력 : "+pressure); } /* * Observable에서 notifyObservers()를 호출할 시 해당 메소드가 호출되어 옵저버의 데이터가 갱신 */ @Override public void update(Observable o) { if(o instanceof WeatherData){ WeatherData weatherData = (WeatherData)o; this.temperature = weatherData.getTemperature(); this.humidity = weatherData.getHumidity(); this.pressure = weatherData.getPressure(); display(); } } } class EnglishDisplay implements Observer, Display{ private Observable observable; // 등록될 Observable private float temperature; private float humidity; private float pressure; public EnglishDisplay(Observable observable) { this.observable = observable; observable.addObserver(this); //this(EnglishDisplay)를 옵저버로 등록 } @Override public void display() { System.out.println("temperature : "+temperature); System.out.println("humidity : "+humidity); System.out.println("pressure : "+pressure); } /* * Observable에서 notifyObservers()를 호출할 시 해당 메소드가 호출되어 옵저버의 데이터가 갱신 */ @Override public void update(Observable o) { if(o instanceof WeatherData){ WeatherData weatherData = (WeatherData)o; this.temperature = weatherData.getTemperature(); this.humidity = weatherData.getHumidity(); this.pressure = weatherData.getPressure(); display(); } } }
Observer는 JDK API를 사용했던 것과 거의 달라지는 게 없고 Observer 인터페이스만 변경했다.
<직접 구현한 Observable>
public interface Observable { public void addObserver(Observer o); //옵저버 등록 public void deleteObserver(Observer o); //옵저버 제거 public void notifyObservers(); //옵저버에 데이터 전송 } class WeatherData implements Observable{ private ArrayListobservers; //등록할 옵저버 리스트 private float temperature; private float humidity; private float pressure; public WeatherData() { observers = new ArrayList (); } /* * 옵저버 등록 메소드 */ @Override public void addObserver(Observer o) { observers.add(o); } /* * 옵저버 제거 메소드 */ @Override public void deleteObserver(Observer o) { int i = observers.indexOf(o); if(i>=0){ observers.remove(i); } } /* * 옵저버에 데이터 전달 */ @Override public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer = (Observer)observers.get(i); observer.update(this); } } public void setData(float temperature, float humidity, float pressure){ this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; notifyObservers(); } public float getTemperature() { return temperature; } public float getHumidity() { return humidity; } public float getPressure() { return pressure; } }
'자바 > 디자인패턴' 카테고리의 다른 글
퍼사드 패턴 (0) | 2017.06.08 |
---|---|
프로토타입 패턴 (0) | 2017.06.08 |
컴퍼지트 패턴 (0) | 2017.06.07 |
데코레이터(Decorator) 패턴 (0) | 2017.06.06 |
옵저버(Observer) 패턴(1) - JDK API 활용 (0) | 2017.06.06 |