設計模式(2)_JAVA內置觀察者模式

設計模式(2)_JAVA內置觀察者模式

服務站 需繼承java.util.observable(註冊,取消,通知)

觀察者 需實現java.util.observer(更新)

1.服務站(weatherData)

package Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Subject.subjectIns;

import java.util.Observable;

public class weatherDataSub extends Observable {

    /////////////氣象觀察站功能
    //數據變化,實時通知觀察者
    public void setData(float mTemparature,float mPressure,float mHimidity){
        weatherData weatherData = new weatherData(mTemparature,mPressure,mHimidity);
        this.setChanged();//設置是否通知,可以用於對是否通知的控制
        this.notifyObservers(weatherData);//將通知消息發送給觀察者
        this.notifyObservers();//只通知,不發送通知消息
    }

    public class weatherData{
        public float mTemparature,mPressure,mHimidity;//溫度//氣壓//溼度
        public weatherData(float mTemparature, float mPressure, float mHimidity) {
            this.mTemparature = mTemparature;
            this.mPressure = mPressure;
            this.mHimidity = mHimidity;
        }
    }

}

2.觀察者

--1.當日氣象大屏(todayCondition)

package Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Observe.observerIns;

import Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Subject.subjectIns.weatherDataSub;

import java.util.Observable;
import java.util.Observer;

/**
 * 使用Java內置觀察者Observer
 */
public class todayCondition implements Observer {
    //////////////////////////////////////////
    /**
     * //展示通知消息(控制檯打印輸出)
     * @param notification
     */
    public void display(Object notification){
        weatherDataSub.weatherData weatherData = (weatherDataSub.weatherData) notification;
        System.out.println("*****************最新通知****************************");
        System.out.println("****today溫度:"+weatherData.mTemparature+"*********");
        System.out.println("****today氣壓:"+weatherData.mPressure+"*********");
        System.out.println("****today溼度:"+weatherData.mHimidity+"*********");
        System.out.println("**************************************************");

    }
    /**
     * 更新通知
     * @param o
     * @param arg
     */
    @Override
    public void update(Observable o, Object arg) {
        this.display(arg);//展示通知消息(控制檯打印輸出)
    }
}

--2.明日氣象大屏(tomorrowCondition)

package Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Observe.observerIns;

import Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Subject.subjectIns.weatherDataSub;

import java.util.Observable;
import java.util.Observer;

/**
 * 使用Java內置觀察者Observer
 */
public class tomorrowCondition implements Observer {
    //////////////////////////////////////////
    /**
     * //展示通知消息(控制檯打印輸出)
     * @param notification
     */
    public void display(Object notification){
        weatherDataSub.weatherData weatherData = (weatherDataSub.weatherData) notification;
        System.out.println("*****************最新通知****************************");
        System.out.println("****tomorrow溫度:"+(++weatherData.mTemparature)+"*********");
        System.out.println("****tomorrow氣壓:"+(++weatherData.mPressure)+"*********");
        System.out.println("****tomorrow溼度:"+(++weatherData.mHimidity)+"*********");
        System.out.println("*******************************************************");
    }
    /**
     * 更新通知
     * @param o
     * @param arg
     */
    @Override
    public void update(Observable o, Object arg) {
        this.display(arg);//展示通知消息(控制檯打印輸出)
    }
}

3.Test

package Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示;

import Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Observe.observerIns.todayCondition;
import Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Observe.observerIns.tomorrowCondition;
import Java內置觀察者模式_氣象站大屏展示.Subject.subjectIns.觀察者模式_氣象站大屏展示.Subject.subjectIns.weatherDataSub;
import org.junit.Test;

/**
 * Java內置觀察者模式測試
 */
public class test {
    @Test
    public void test01() {
        //初始化
        weatherDataSub weatherDataSub= new weatherDataSub();//氣象服務站
        todayCondition todayCondition = new todayCondition();//觀察者1
        tomorrowCondition tomorrowCondition = new tomorrowCondition();//觀察者2
        //註冊觀察者
        weatherDataSub.addObserver(todayCondition);
        weatherDataSub.addObserver(tomorrowCondition);
        //氣象服務站數據更新
        weatherDataSub.setData(30,60,110);
        //移除觀察者2
        weatherDataSub.deleteObserver(tomorrowCondition);
        System.out.println("觀察者2取消註冊!");
        //氣象服務站數據更新
        weatherDataSub.setData(60,120,210);

    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章