亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 1591 0

?通俗的說:我們向報社訂閱報紙,這個就是觀察者模式的實例,我們是觀察者(Observer),報社就是主題(Subject)。

?

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

?

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

?

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

?

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

?


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

    /**
 * 主題
 * @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();
}

/**
 * 主題實現(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();
	}
}

/**
 * 布告板實現(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);
	}
}

/**
 * 測試類
 * @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è)計模式之二觀察者模式


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 婷婷网五月天天综合天天爱 | 伊人免费视频网 | 奇米影视大全 | 国产精品久久久久久一区二区 | 夜夜爽夜夜叫夜夜高潮漏水 | 色黄网站成年女人色毛片 | 四虎在线精品 | 国产a久久精品一区二区三区 | 国产99re在线观看只有精品 | 国产成人精品曰本亚洲 | 四虎国产精品永久地址49 | 草草免费观看视频在线 | 九九性视频 | 国产看色免费 | 亚洲视频在线网 | 欧美天天综合 | 日韩亚洲欧美一区 | 99爱视频| 久久国产一片免费观看 | 欧美日韩久久中文字幕 | 亚洲国产激情一区二区三区 | 狠狠色狠狠色综合网 | 欧美午夜片 | 久久国产高清字幕中文 | 日产一二三四五六七区麻豆 | 色综合一本| 99se亚洲综合色区 | 午夜精品久久久久久 | 精品久久视频 | 99爱免费 | 在线免费观看亚洲 | 99re热久久资源最新获取 | 美女在线视频观看影院免费天天看 | 国产在线视频精品视频免费看 | 日本一级在线播放线观看免 | 999国产视频| 久久成人在线观看 | 欧美一级毛片片免费 | 中文字幕亚洲综合久久男男 | 日本黄色录像 | 久夜tv |