设计模式: 自己手动实现一个观察者设计模式
2015-08-24 09:43
471 查看
观察者模式: 定义了对象之间的一对多依赖,这样一来,当一个对象(被观察者)改变状态时,它的所有依赖者(观察者)都会收到通知并自动更新。
在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式, 你可以改变依赖主题状态的对象,却不必改变主题,这叫提前规划。
主题和观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者的接口通知观察者。这样可以让两者之间运作正常,有同时具有松耦合的优点。
观察者模式利用“组合”将许多观察者组合进主题中。对象之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式而产生的。
下面来看观察者设计模式的一个完整Demo
程序的输出 : Current conditions:80.0F Degrees and 65.0% humidity
在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式, 你可以改变依赖主题状态的对象,却不必改变主题,这叫提前规划。
主题和观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者的接口通知观察者。这样可以让两者之间运作正常,有同时具有松耦合的优点。
观察者模式利用“组合”将许多观察者组合进主题中。对象之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式而产生的。
下面来看观察者设计模式的一个完整Demo
package observer; /** * 被观察者接口 * @author Arvon * */ public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); }
package observer; /** * 观察者接口 * @author Administrator * */ public interface Observer { public void update(float temp,float humidity, float pressure); }
package observer; /** * 布告板接口 * @author Administrator * */ public interface DisplayElement { public void display(); }
package observer; import java.util.ArrayList; import java.util.List; /** * 被观察者的实现类 * 主题 * @author Administrator * */ public class WeatherData implements Subject { private List<Observer> observersList; private float pressure; private float humidity; private float temp; public WeatherData() { super(); observersList = new ArrayList<Observer>(); } @Override public void registerObserver(Observer o) { observersList.add(o); } @Override public void removeObserver(Observer o) { int i = observersList.indexOf(o); if(i>=0) observersList.remove(i); } @Override public void notifyObservers() { for (Observer observer : observersList) { observer.update(temp, humidity, pressure); } } public void setMeasurements(float temp, float humidity, float pressure){ this.temp = temp; this.humidity = humidity; this.pressure = pressure; messurementsChanged(); } /** * 当新的天气数据送来时,通知观察者 */ private void messurementsChanged() { // TODO Auto-generated method stub notifyObservers(); } }
package observer; /** * 目前天气状况 布告板 * @author Administrator * */ public class CurrentConditionsDisplay implements Observer, DisplayElement { private float pressure; private float humidity; private float temp; private WeatherData weatherData; public CurrentConditionsDisplay(WeatherData weatherData) { super(); this.weatherData =weatherData; weatherData.registerObserver(this); } @Override public void display() { System.out.println("Current conditions:" + temp + "F Degrees and " + humidity + "% humidity"); } @Override public void update(float temp, float humidity, float pressure) { this.temp = temp; this.humidity = humidity; this.pressure = pressure; display(); } }
package observer; /** * 气候统计 * @author Administrator * */ public class StatisticsDisplay implements DisplayElement, Observer { @Override public void update(float temp, float humidity, float pressure) { // TODO Auto-generated method stub } @Override public void display() { // TODO Auto-generated method stub } }
package observer; /** * 天气预报 * @author Administrator * */ public class ForecastDisplay implements DisplayElement, Observer { @Override public void update(float temp, float humidity, float pressure) { // TODO Auto-generated method stub } @Override public void display() { // TODO Auto-generated method stub } }
package observer; /** * 测试类 * @author Administrator * */ public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay cDisplay = new CurrentConditionsDisplay(weatherData); weatherData.setMeasurements(80.0f, 65, 30.4f); } }
程序的输出 : Current conditions:80.0F Degrees and 65.0% humidity
相关文章推荐
- Http协议提要
- bzoj4002
- 【移动】
- css属性image-redering详解
- Hibernate笔记――1.Hibernate简介
- css属性image-redering详解
- css属性image-redering详解
- Friend
- 社説 20150824 野党安保対案 建設的な修正協議を求めたい
- 缓存类型?——我所见到的缓存
- PDF文档处理控件Spire.PDF发布了3.5版本
- windows 关机命令
- css属性image-redering详解
- json解析
- css属性image-redering详解
- OJ刷题---罗马数字转十进制
- 社説 20150824 震災遺構の保存 合意形成へ議論を尽くそう
- 20个高级java面试题汇总
- Android监听照相广播
- dedecms 蜘蛛抓取设置 robots.txt