观察者模式(Observer Pattern)——让你的对象知悉现状
来源:互联网 发布:企业网络初步设计方案 编辑:程序博客网 时间:2024/06/07 19:45
目录
- 概述
- 观察者模式类图
- 需要注意的东西
- 从主题推push和拉push数据
- 应用场景
- 场景说明
- 类图设计
- 代码实现
- 总结
概述
观察者模式类图
需要注意的东西
从主题推(push)和拉(push)数据
/*@param sub 主题,为了让观察者知道是哪一个主题通知它的 @param arg 通知的内容,是notifyObservers()传入的数据对象/*public void update(Subject sub,Object arg){……}//从主题推数据/*@param arg 通知的内容*/public void notifyObservers(Object arg){ ``` foreach(observe:Observers){ ``` observer.update(this,arg); ``` } ```}//从主题拉数据setChanged(){ changed = true;}public void notifyObservers(Object arg){ ``` if(changed){ // notify 只会在changed == true的时候通知观察者 foreach(observe:Observers){ ``` observer.update(this,arg); ``` } chaned=false; } ```}
事实上在我看来推数据和拉数据最大的区别拉数据让观察者可以拥有从主题处选择数据的权利,而推数据,则不考虑观察者是否需要,一味地推送信息。
应用场景
场景说明
类图设计
代码实现
package observer.api;/** * <p>ClassName Subject * <p>Description * <p>Author ChongLou * <p>Version * <p>Date 2017/7/12 21:56 */public interface Subject { /** * 注册观察者 * @param observer */ public void registerObserver(Observer observer); /** * 移除观察者 * @param observer */ public void removeObserver(Observer observer); /** * 通知观察者 */ public void notifyObservers();}
package observer.api;/** * <p>ClassName Observer * <p>Description 观察者 * <p>Author ChongLou * <p>Version * <p>Date 2017/7/12 21:57 */public interface Observer { /** * 主题用以更新观察者 * @param temperature * @param humidity * @param pressure */ public void update(float temperature,float humidity ,float pressure);}
package observer.api;/** * <p>ClassName DisplayElement * <p>Description * <p>Author ChongLou * <p>Version * <p>Date 2017/7/12 21:59 */public interface DisplayElement { //布告板显示 public void display();}
package observer.impl;import observer.api.Observer;import observer.api.Subject;import java.util.ArrayList;import java.util.Iterator;/** * <p>ClassName WeatherData * <p>Description * <p>Author ChongLou * <p>Version * <p>Date 2017/7/12 22:06 */public class WeatherData implements Subject { private ArrayList<Observer> observerList; private float temperature; //温度 private float humidity; //湿度 private float pressure; //气压 public WeatherData() { this.observerList = new ArrayList<Observer>(); } public void registerObserver(Observer observer) { observerList.add( observer ); } public void removeObserver(Observer observer) { int index = observerList.indexOf( observer ); if (index >= 0) { observerList.remove( index ); } } public void notifyObservers() { Iterator<Observer> iterator = observerList.iterator(); while (iterator.hasNext()) { iterator.next().update( temperature, humidity, pressure ); } } /** * 得到更新值之后,通知观察者 */ public void measurementsChanged() { notifyObservers(); } public void setMeasurements(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); }}
package observer.impl;import observer.api.DisplayElement;import observer.api.Observer;import observer.api.Subject;/** * <p>ClassName CurrentConditionsDisplay * <p>Description 采用推的方式更新数据 * <p>Author ChongLou * <p>Version * <p>Date 2017/7/12 22:08 */public class CurrentConditionsDisplay implements DisplayElement, Observer { private float temperature; //温度 private float humidity; //湿度 private float pressure; //气压 private Subject subject ; //当前通知的主题 public CurrentConditionsDisplay(Subject subject) { this.subject = subject; } public void update(float temperature, float humidity, float pressure) { if (subject instanceof WeatherData) { // 如果是当前主题是WeatherData,才会更新布告板 this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; display(); } } public void display() { System.out.println( "天气信息更新啦!!!" + "temperature=" + temperature + ", humidity=" + humidity + ", pressure=" + pressure ); }}
import observer.impl.CurrentConditionsDisplay;import observer.impl.WeatherData;/** * <p>ClassName TestObserver * <p>Description 测试 * <p>Author ChongLou * <p>Version * <p>Date 2017/7/12 22:21 */public class TestObserver { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentConditionsDisplay1 = new CurrentConditionsDisplay( weatherData ); CurrentConditionsDisplay currentConditionsDisplay2 = new CurrentConditionsDisplay( weatherData ); weatherData.registerObserver( currentConditionsDisplay1 ); weatherData.setMeasurements( 1.1f,1.2f,1.3f ); weatherData.registerObserver( currentConditionsDisplay2 ); weatherData.setMeasurements( 2.1f,2.2f,3.3f ); weatherData.removeObserver( currentConditionsDisplay1 ); weatherData.setMeasurements( 3.1f,3.2f,3.3f ); }}
运行结果
总结
阅读全文
1 0
- 观察者模式(Observer Pattern)——让你的对象知悉现状
- 观察者模式 —— 让你的对象知悉现况
- 观察者模式 —— 让你的对象知悉现况
- 2.观察者模式:让你的对象知悉现况
- 对象行为型模式——观察者模式(Observer Pattern)
- 对象间的联动——观察者模式(Observer Pattern)
- 观察者模式——Observer Pattern
- 如何让孩子爱上设计模式 ——15.观察者模式(Observer Pattern)
- Design Pattern—— Observer Pattern 观察者模式
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern)
- 观察者模式(Observer Pattern
- Observer Pattern(观察者模式)
- Observer Pattern(观察者模式)
- 观察者模式(Observer Pattern)
- 观察者模式 ObServer Pattern
- Nginx配置教程
- 实训笔记第十二天
- 服务器架构的演变
- 厦门工程技术人员职称评审 总体梳理
- weakreference实现原理分析
- 观察者模式(Observer Pattern)——让你的对象知悉现状
- JSP EL表达式 学习 应用
- 思维导图---区块链技术和区块链应用
- Combination Sum
- 深入spring cloud(1)
- POJ1598-C语言
- CodeForces 566 A Matching Names(Trie 匹配LCP和最大)
- git学习笔记2——ProGit2
- 【Leetcode】【python】Factorial Trailing Zeroes