관찰자 모드(Observer Patterns)
3998 단어 observer
먼저 정의: 관찰자 모델은 대상 간의 일대다 의존 관계를 정의하는 것이다. 한 대상의 상태가 바뀔 때 모든 의존 대상은 메시지를 전송받고 스스로 업데이트를 해서 바뀐다.
나의 이해: 생활 속에서 매우 많은 이런 사례가 있다. 예를 들어 기상 관측소와 기상 관측기의 관계, 기상 관측소는 데이터 센터로 최신 기상 소식을 얻는 것을 책임진다. 기상 관측기는 설령 이런 소식을 나타낸다 하더라도 모든 기상 관측기는 기상 관측소에 의존하고 구직자와 헤드헌터의 관계도 있다. 헤드헌터는 새로운 정보가 있다고 가정하면 구직자에게 전달할 것이다.이곳의 기상청은 바로 주제(중심)이고, 모니터는 관찰자이다.
개인 감각 가설은 관찰자 모드를 사용하려면 반드시 인터페이스 프로그래밍을 위한 디자인 원칙을 사용해야 하며 Subject 인터페이스를 정의하여 등록, 취소, 전송해야 한다.업데이트를 위해 Observer 인터페이스를 정의합니다. 관찰자가 다른 기능이 있다고 가정하고 디스플레이 () 인터페이스와 같은 다른 인터페이스를 써야 합니다.
먼저 Subject 인터페이스: 등록, 등록 취소, 메시지 푸시 방법을 제공합니다.
package interfaces;
public interface Subject {
public void registeObserver (Observer observer);
public void removeObserver (Observer observer);
//notify: ,
public void notifyObserver ();
}
그 다음에 Observer 인터페이스에서 가져온 데이터를 로컬 실례 데이터로 업데이트하는 업데이트 작업을 제공합니다.
package interfaces;
public interface Observer {
public void uodate (float temp, float humidity, float pressure);
}
Display Element 인터페이스는 Display 방법을 제공합니다.
package interfaces;
public interface DisplayElement {
public void display();
}
그 다음에 Weather Data, 날씨 정보 데이터 센터 클래스, Subject 인터페이스를 실현하고 set Measurements 방법과 measurment Changed 방법을 제공했다. 관찰자 등록의 실현은 사실상 이 관찰자를 센터의List에 추가하는 것이다. 통지 조작은 List를 두루 훑어보고 안의 update 방법을 사용한다.
package subjects;
import java.util.ArrayList;
import java.util.List;
import interfaces.Observer;
import interfaces.Subject;
public class WeatherData implements Subject {
private List list;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
list = new ArrayList();
}
@Override
public void registeObserver(Observer observer) {
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int i = list.indexOf(observer);
if(i>=0) {
list.remove(i);
}
}
@Override
public void notifyObserver() {
for(int i=0;i<list.size();i++) {
Observer o = (Observer)list.get(i);
o.uodate(temperature, humidity, pressure);
}
}
public void measurementsChanged() {
notifyObserver();
}
public void setMeasures(float temp, float humidity, float pressure) {
this.temperature = temp;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
그런 다음 관찰자 CurrentConditionDisplay를 정의합니다.새로 지을 때는 데이터 센터를 전달해야 한다.
package observers;
import subjects.WeatherData;
import interfaces.DisplayElement;
import interfaces.Observer;
import interfaces.Subject;
public class CurrentConditionDisplay implements Observer, DisplayElement {
private float tempurature;
private float humidity;
private float pressure;
private Subject weatherData;
public CurrentConditionDisplay(WeatherData weatherData) {
this.weatherData = weatherData;
weatherData.registeObserver(this);
}
@Override
public void uodate(float tempurature, float humidity, float pressure) {
this.tempurature = tempurature;
this.humidity = humidity;
this.pressure = pressure;
display();
}
@Override
public void display() {
System.out.println(tempurature + ";/n" + humidity + ";/n" +pressure );
}
}
마지막으로 테스트 클래스:
package test;
import observers.CurrentConditionDisplay;
import subjects.WeatherData;
public class Test {
public static void main(String args[]) {
WeatherData weatherData = new WeatherData();
CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(weatherData);
weatherData.setMeasures(14.1f, 11.0f, 111.0f);
}
}
사실 자바의 스윙 메커니즘은 이런 모델을 대량으로 운용했다. 예를 들어 button과 모니터의 관계, button은 피관찰자이고 모니터는 관찰자이며add Listener일 때 사실상 모니터 대상을 자신의 리스트에 넣고 클릭할 때list 안의 모니터의performXX 방법을 사용한다.
비록 단지 예시를 통해 이해하고 연습했을 뿐이지만 앞으로 실제 프로젝트에서 사용될 것인지, 숙련될 것인지 등 임무는 무겁고 갈 길은 멀다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[iOS][Objective-C] 기기를 조작할 때 게시되는 알림의 observator 등록기기 옆의 볼륨 버튼을 눌렀을 때 호출되는 처리 정보 iOS에서 개발하고 있는 동안 장치의 조작을 다룰 때가 있다. 그 때 자주 사용하는 것을 쓰려고 생각했습니다. 그 밖에도 추천이 있으면 알려주세요. SampleV...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.