预览加载中,请您耐心等待几秒...
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://www.cnblogs.com/chenssy/archive/2013/05/22/3092071.html"设计模式读书笔记-----观察者模式 学习设计模式已经有段时间了,这是总结的第一篇博客,文中有错误、漏洞之处,望各位支出,改正。 观察者模式 一、基本定义 何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。 在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展。 观察者模式又称为发布-订阅模式。 二、基本结构 首先先看观察者模式的UML类图。 分析: Subject:目标。他把所有对观察者对戏的引用保存在一个聚集里,每一个主题都可以有多个观察者。 Observer:观察者。为所有的具体观察者定义一个接口,在得到主题的通知时能够及时的更新自己。 ConcreteSubject:具体主题。将有关状态存入具体观察者对象。在具体主题发生改变时,给所有的观察者发出通知。 ConcreteObserver:具体观察者。实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态相协调。 三、实现观察者模式 情景是这样的:在气象观测站中,它能够追踪目前的天气状况,包括温度、适度、气压。需要实现一个布告板,能够分别显示目前的状态,气象统计和简单的预报。当气象站中获取最新的测量数据时,三种布告板必须实时更新。 下面是这个案例的设计图: 编码实现: 主题接口Subject.java 1publicinterfaceSubject{ 2/** 3*注册观察者 4*@paramobserver 5*/ 6publicvoidregisterObserver(Observerobserver); 7 8/** 9*删除观察者 10*@paramobserver 11*/ 12publicvoidremoveOberver(Observerobserver); 13 14/** 15*当主题状态发生改变时,这个方法需要被调用,以通知所有观察者 16*/ 17publicvoidnotifyObserver(); 18} 观察者接口Observer.java 1publicinterfaceObserver{ 2publicvoidupdate(floattemp,floathumidity,floatpressure); 3} 布告板显示接口DisplayElement.java 1publicinterfaceDisplayElement{ 2publicvoiddisplay(); 3} WeatherData实现主题接口WeatherData.java 1publicclassWeatherDataimplementsSubject{ 2privateList<Observer>observers; 3privatefloattempterature; 4privatefloatpressure; 5privatefloathumidity; 6 7publicWeatherData(){ 8observers=newArrayList<Observer>(); 9} 10 11@Override 12publicvoidnotifyObserver(){ 13for(inti=0;i<observers.size();i++){ 14Observerobserver=observers.get(i); 15observer.update(tempterature,humidity,pressure); 16} 17} 18 19@Override 20publicvoidregisterObserver(Observerobserver){ 21observers.add(observer); 22} 23 24@Override 25publicvoidremoveOberver(Observerobserver){ 26inti=observers.indexOf(observer); 27if(i>=0){ 28observers.remove(i); 29} 30} 31 32/** 33*气象站得到更新的观测数据时,通知观察者 34*/ 35publicvoidmeasurementChanged(){ 36notifyObserver(); 37} 38 39publicvoidsetMeasurements(floattemperature,floathu