Head First 디자인 모델 의 관찰자 모델

관찰자 모드: 게시 - 구독 모드 라 고도 합 니 다.게시 자의 데이터 가 바 뀌 었 을 때 모든 구독 자 에 게 변 화 를 알려 야 합 니 다.신문 구독 과 비슷 하 게 신문 사 는 게시 자 이 고 독 자 는 구독 자 이다. 
수요 분석:
기상 관측소 에서 수집 한 데 이 터 는 세 개의 게시판 에 전시 하 는 데 사 용 됩 니 다. 이러한 시스템 을 설계 하여 우리 가 원 하 는 기능 을 완성 하 십시오. 기상 데이터 가 변화 할 때 즉시 세 개의 게시판 에 데 이 터 를 업데이트 하 라 고 통지 하 십시오.우리 가 있 는 이곳 의 기상 관측소 가 바로 게시 자 이 고, 세 개의 게시판 이 바로 구독 자 이다.
 
디자인 아이디어: 
1. 기상 관측소 류 를 설계 하고 그 안에 각종 기상 데 이 터 를 저장 합 니 다.
2. 서로 다른 게시판 을 디자인 하여 데 이 터 를 표시 하고 통 일 된 데이터 업데이트 방법 을 디자인 하여 데이터 디 스 플레이 를 업데이트 하 는 데 사용 합 니 다.
3. 기상 관측소 류 에서 구독 자 관리 방법 을 제공 하고 모든 구독 자의 대상 인 스 턴 스 를 저장 하 며 데이터 가 변 할 때 게시 자 는 데 이 터 를 구독 자 에 게 하나씩 알 리 고 구독 취소 방법 을 제공한다.
 
코드 구현: 
1. 게시 자 정의 
//  Observable
public class WeatherData extends Observable{
    
    //  
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData(){
    }
    
    //      ,    
    public void measurementsChanged(){
        setChanged();
        notifyObservers();
    }
    
    //      
    public void setMeasurements(float temperature, float humidity, float pressure){
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();
    }
    
    //        pull  

    public float getTemperature(){
        return this.temperature;
    }

    public float getHumidity(){
        return this.humidity;
    }

    public float getPressure(){
        return this.pressure;
    }
}

2. 구독 자 정의 
public class CurrentConditionDisplay implements Observer, DisplayElement{
    
    Observable observable;
    private float temperature;
    private float humidity;

    public CurrentConditionDisplay(Observable observable){
        this.observable = observable;
        //     
        observable.addObserver(this);
    }

    public void update(Observable obs, Object arg){
        if(obs instanceof WeatherData){
            WeatherData weatherData = (WeatherData)obs;
            //  pull  
            this.temperature = weatherData.getTemperature();
            this.humidity = weatherData.getHumidity();
            display();
        }
    }
}

 
장점:
1. 데이터 가 바 뀌 면 구독 자 에 게 직접 알려 줍 니 다.
2. 자동 pull 의 방법 은 유연성 을 제공한다.

좋은 웹페이지 즐겨찾기