日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

設(shè)計(jì)模式之二觀察者模式

系統(tǒng) 1831 0

?通俗的說(shuō):我們向報(bào)社訂閱報(bào)紙,這個(gè)就是觀察者模式的實(shí)例,我們是觀察者(Observer),報(bào)社就是主題(Subject)。

?

觀察者模式定義了對(duì)象之間的一對(duì)多依賴,這樣一來(lái),當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),它的所有依賴者都會(huì)收到通知并自動(dòng)更新。

?

?現(xiàn)在我們?cè)O(shè)計(jì)一個(gè)氣象監(jiān)測(cè)站系統(tǒng),此系統(tǒng)中的三個(gè)部分分別是氣象站(獲取實(shí)際氣象數(shù)據(jù))、布告板(顯示當(dāng)前的天氣狀況)

?

、WeatherData(跟蹤來(lái)自氣象站的數(shù)據(jù),并更新布告板),布告板可以提供擴(kuò)展。

?

系統(tǒng)設(shè)計(jì)類圖如下:

?


設(shè)計(jì)模式之二觀察者模式
?

    /**
 * 主題
 * @author wengn
 *
 */
public interface Subject {
	public void registerObserver(Observer o);
	
	public void removeObserver(Observer o);
	
	public void notifyObserver();
}

/**
 * 觀察者
 * @author wengn
 *
 */
public interface Observer {
	public void update(float temp,float humidity,float pressure);
}

/**
 * 布告板接口
 * @author wengn
 *
 */
public interface DisplayElement {
	public void display();
}

/**
 * 主題實(shí)現(xiàn)類
 * @author Administrator
 *
 */
public class WeatherData implements Subject {
	private ArrayList observers;
	private float temperature;
	private float humidity;
	private float pressure;

	public WeatherData(){
		observers = new ArrayList();
	}
	
	public void notifyObserver() {
		for(int i=0;i<observers.size();i++){
			Observer o = (Observer)observers.get(i);
			o.update(temperature, humidity, pressure);
		}
	}

	public void registerObserver(Observer o) {
		observers.add(o);
	}

	public void removeObserver(Observer o) {
		int i = observers.indexOf(o);
		if(i>=0){
			observers.remove(i);
		}
	}
	
	public void measurementsChanged(){
		this.notifyObserver();
	}
	
	public void setMeasurements(float temperature,float humidity,float pressure){
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}
}

/**
 * 布告板實(shí)現(xiàn)類
 * @author wengn
 *
 */
public class CurrentConditionsDisplay implements Observer, DisplayElement {
	private float temperature;
	private float humidity;
	private Subject weatherData;
	
	public CurrentConditionsDisplay(Subject s){
		this.weatherData = s;
		weatherData.registerObserver(this);
	}

	public void update(float temp, float humidity, float pressure) {
		this.temperature = temp;
		this.humidity = humidity;
		display();
	}

	public void display() {
		System.out.println("show:"+temperature+"||"+humidity);
	}
}

/**
 * 測(cè)試類
 * @author wengn
 *
 */
public class Test {

	public static void main(String[] args) {
		WeatherData wd = new WeatherData();
		CurrentConditionsDisplay ccd = new CurrentConditionsDisplay(wd);
		wd.setMeasurements(0, 0, 0);
		wd.setMeasurements(1, 1, 1);
		wd.setMeasurements(2, 2, 2);
	}
}

  

?

? 附上java awt中觀察者模式的模擬代碼:

?

?

    package com.hanbing.awt;

import java.util.ArrayList;
import java.util.List;

public class MyAwt {
	public static void main(String[] args) {
		Button bt = new Button();
		MyActionLisenter lisenter = new MyActionLisenter();
		MyActionLisenter2 lisenter2 = new MyActionLisenter2();
		bt.addActionLisenter(lisenter);
		bt.addActionLisenter(lisenter2);
		bt.buttonPressed();
	}
}


class Button {
	private List<ActionLisenter> list = new ArrayList<ActionLisenter>();

	public void buttonPressed() {
		ActionEvent e = new ActionEvent(System.currentTimeMillis(), this);
		for (ActionLisenter lisenter:list) {
			lisenter.actionPerformed(e);
		}
	}

	public void addActionLisenter(ActionLisenter lisenter) {
		list.add(lisenter);
	}
}


interface ActionLisenter {
	public void actionPerformed(ActionEvent e);
}


class MyActionLisenter implements ActionLisenter {
	public void actionPerformed(ActionEvent e) {
		System.out.println("oh my god!!!");
	}
}


class MyActionLisenter2 implements ActionLisenter {
	public void actionPerformed(ActionEvent e) {
		System.out.println("oh my god2!!!");
	}
}


class ActionEvent {
	private long when;

	private Object source;

	public ActionEvent(long when, Object source) {
		super();
		this.when = when;
		this.source = source;
	}

	public long getWhen() {
		return when;
	}
	
	public Object getSource(){
		return source;
	}
}
  

?

設(shè)計(jì)模式之二觀察者模式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 漳平市| 侯马市| 涞源县| 那曲县| 呼玛县| 宁夏| 梁山县| 涿州市| 松桃| 泸定县| 蒙山县| 璧山县| 黔江区| 嵊州市| 贡嘎县| 库车县| 武穴市| 临夏市| 宁德市| 涡阳县| 醴陵市| 黔南| 丰原市| 正蓝旗| 阿拉善右旗| 柘城县| 普安县| 西乌| 庄浪县| 隆子县| 四会市| 南江县| 杂多县| 蒙自县| 新巴尔虎左旗| 栖霞市| 嘉荫县| 平谷区| 河源市| 托克托县| 宁南县|