221观察者Observer模式_第1页
221观察者Observer模式_第2页
221观察者Observer模式_第3页
221观察者Observer模式_第4页
221观察者Observer模式_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、观察者(observer)模式 目的: 在多个对象之间建立一对多的关系,当一个对象改变时,其它所有的依赖对象自动发生改变。 这个对象叫作被观察者(subject),其它依赖的对象叫做观察者(observer)。也叫作:dependents(依赖, publish-subscribe(发布-订阅), model-view使用场合 内容和显示分离,视图同步。如:observer模式(三) struct participants subject、concretesubject、observer、concreteobserverobserver模式 collaborations一个简单例子 obser

2、ver接口public interface observer public abstract void update(numbergenerator generator);两个concrete observer的具体实现public class digitobserver implements observer public void update(numbergenerator generator) system.out.println(digitobserver: + generator.getnumber(); try thread.sleep(100); catch (interrup

3、tedexception e) public class graphobserver implements observer public void update(numbergenerator generator) system.out.print(graphobserver:); int count = generator.getnumber(); for (int i = 0; i count; i+) system.out.print(*); system.out.println(); try thread.sleep(100); catch (interruptedexception

4、 e) import java.util.vector;import java.util.iterator;public abstract class numbergenerator private vector observers = new vector(); / 储存observer public void addobserver(observer observer) / 新增observer observers.add(observer); public void deleteobserver(observer observer) / 刪除observer observers.remo

5、ve(observer); public void notifyobservers() / 通知observer iterator it = observers.iterator(); while (it.hasnext() observer o = (observer)it.next(); o.update(this); public abstract int getnumber(); / 取得数值 public abstract void execute(); / 产生数值import java.util.random;public class randomnumbergenerator

6、extends numbergenerator private random random = new random(); / 随机数生成器 private int number; / 目前数值 public int getnumber() / 取得数值 return number; public void execute() for (int i = 0; i 20; i+) number = random.nextint(50); notifyobservers(); public class main public static void main(string args) number

7、generator generator = new randomnumbergenerator(); observer observer1 = new digitobserver(); observer observer2 = new graphobserver(); generator.addobserver(observer1); generator.addobserver(observer2); generator.execute(); 使用java.util.observer和java.util.observable使用java.util.observerimport java.uti

8、l.*;public class concretesubject extends observableprivate string name;private float price;public concretesubject(string name, float price) = name;this.price = price;system.out.println(concretesubject concretesubject created: + name + at + price); public string getname() return name; publi

9、c float getprice() return price; public void setname(string name) = name; setchanged ();notifyobservers(name);public void setprice(float price) this.price = price;setchanged();notifyobservers(new float(price);concretesubjectg.javapriceobserver.javaimport java.util.*;public class priceobser

10、ver implements observer private float price;public priceobserver() price = 0;system.out.println(price observercreated: price currently + price);public void update(observable obj, object arg)if (arg instanceof float)price = (float)arg).floatvalue();system.out. println(priceobserver : + price); mvc概述概

11、述mvc是model view control的缩写。mvc是软件设计的典型模式。在这种设计模式下,一个应用被分为三个部分:model,view和controller,每个部分负责不同的功能。model是指应用程序的数据及对这些数据的操作;view是指用户界面;controller负责用户界面和程序数据之间的同步,完成两个方向的动作: -根据用户界面(view)的操作完成对程序数据(model)的更新 -将程序数据(model)的改变及时反应到用户界面(view)上 经典软件体系结构经典软件体系结构:模型视图控制器模型视图控制器(mvc,modelviewcontroller)。控制器控制器模

12、型模型视图视图在在mvc结构中,结构中,模型模型是软件应用领域中的是软件应用领域中的各种对象,它们的操作独立于用户界面;各种对象,它们的操作独立于用户界面;视图视图则管理用户界面的输出;而则管理用户界面的输出;而控制器控制器处处理软件的输入。理软件的输入。输入事件给出要发送给模型的消息。一旦输入事件给出要发送给模型的消息。一旦模型改变了它的状态,就立即通过关联机模型改变了它的状态,就立即通过关联机制通知视图,让视图刷新显示。这个关联制通知视图,让视图刷新显示。这个关联机制定义了在模型与各个视图之间的关系,机制定义了在模型与各个视图之间的关系,它允许模型的运行独立于与它相关联的视它允许模型的运行

13、独立于与它相关联的视图。类似地,控制器在输入事件发生时将图。类似地,控制器在输入事件发生时将对视图及模型进行控制与调度。对视图及模型进行控制与调度。对于对于mvc,可通过开发模型的一个派生类,可通过开发模型的一个派生类,履行与应用相关联的处理。如用户界面通履行与应用相关联的处理。如用户界面通过定义视图和控制器的派生类来建立,这过定义视图和控制器的派生类来建立,这些派生类中许多是可复用的类,像按钮和些派生类中许多是可复用的类,像按钮和对话框等,这样可以直接建立新的子系统。对话框等,这样可以直接建立新的子系统。 设计过程的主要活动设计过程的主要活动1) 系统构造系统构造:将系统分解为一系列基本的:

14、将系统分解为一系列基本的子系统,每一子系统是独立的软件成分。子系统,每一子系统是独立的软件成分。2) 控制建模控制建模:建立系统各部分之间的控制:建立系统各部分之间的控制关系的一般模型。关系的一般模型。3) 模块模块分解分解:将子系统进一步分解为模块。:将子系统进一步分解为模块。一个利用一个利用mvcmvc模式开发的小例子模式开发的小例子 利用实现程序,当用户在图形用户界面输入一个球体的半径时,利用实现程序,当用户在图形用户界面输入一个球体的半径时,程序将显示该球体的体积与表面积程序将显示该球体的体积与表面积。 该程序主要由三个类构成,分别为该程序主要由三个类构成,分别为spherespher

15、e类、类、textviewtextview类及类及spherewindowspherewindow类。其类。其中中spheresphere类扮演类扮演modelmodel的角色,的角色,textviewtextview类为类为viewview角色,角色,spherewindowspherewindow类为类为controllercontroller角色。角色。 javajava通过专门的类通过专门的类observableobservable及及observerobserver接口来实现接口来实现mvcmvc编程模式。编程模式。从图中可以看出,从图中可以看出,modelmodel类必须继承类必须

16、继承observableobservable类,类,viewview类必须实现接口类必须实现接口observerobserver由于实现了上述结构,当模型发生改变时(控制器改变模型的状态),模型就会自动刷由于实现了上述结构,当模型发生改变时(控制器改变模型的状态),模型就会自动刷新与之相关的视图。其新与之相关的视图。其umluml序列图可以表示为下图:序列图可以表示为下图:model类sphere,必须扩展observable类,因为在observable类中,方法addobserver()将视图与模型相关联,当模型状态改变时,通过方法notifyobservers()通知视图。其中实现mvc

17、模式的关键代码为 :import java.util.observable;class sphere extends observable.public void setradius(double r) myradius = r; setchanged(); / indicates that the model has changed notifyobservers(); . view类的角色textview类必须实现接口observer,这意味着类textview必须是implements observe,另外还需实现其中的方法update()。有了这个方法,当模型sphere类的状态发生改

18、变时,与模型相关联的视图中的update()方法就会自动被调用,从而实现视图的自动刷新。view类的关键代码如下: import java.util.observer;import java.util.observable;public class textview extends jpanel implements observer. public void update(observable o, object arg) sphere balloon = (sphere)o; radiusin.settext(“ ”+f3.format(balloon.getradius(); volum

19、eout.settext(“ ”+f3.format(balloon.volume(); surfareaout.settext(“ ” + f3.format(balloon.surfacearea(); . spherewindow类作为controller,它主要新建model与view,将view与model相关联,并处理事件,其中的关键代码为: public spherewindow() super(“spheres: volume and surface area”); model = new sphere(0, 0, 100); textview view = new textv

20、iew(); model.addobserver(view); view.update(model, null); view.addactionlistener(this); container c = getcontentpane(); c.add(view);public void actionperformed(actionevent e) jtextfield t = (jtextfield)e.getsource(); double r = double.parsedouble(t.gettext(); model.setradius(r); 扩充一、一个模型、两个视图和一个控制器扩

21、充一、一个模型、两个视图和一个控制器 当用户在图形化用户界面输入一个球体的半径,程序除显示该球体的体积与表面积外,还将图形化显示该球体。 其中model类及view1类根本不需要改变,与前面的完全一样,这就是面向对象编程的好处。对于controller中的spherewindows类,只需要增加另一个视图,并与model发生关联即可。 一个模型、两个视图和两个控制器一个模型、两个视图和两个控制器 上面的程序只能通过键盘输入球体半径,现在要求修改程序,利用鼠标放大、缩小右边的球体图形来改变球体的半径,从而获得球体半径的输入。 此时的mcv模式为一个模型、两个视图和两个控制器,其结构为:一个模型、

22、两个视图和两个控制器的一个模型、两个视图和两个控制器的umluml类图类图 mvc应用 struts框架web servercreates / reusesindex.htmcontrollershowloggingaction.javamappingsbusiness logic layerdata layerview layerjsp engineloggingbean.javalogging.jsploggingformrequest/sessionweb browsergraniterequest:showlogging.docreates form bean in correct s

23、copeperform(mapping, form, request, response)calls business logic ruleto get logging inforeturns forward(success)mainpulates datasetcategorylist(list)forwards logging.jspexpands custom tagsresponse sent to browser pure htmllooks up serverbean.javapopulates form values . logging.jspmessagesresourcesd

24、isplays internationalized messagesweb servercreates / reuses action instancelogging.jspcontrollershowloggingaction.javamappingsbusiness logic layerdata layerview layerjsp engineloggingbean.javaresults.jsploggingformrequest/sessionweb browsergraniteform submit action=savelogging.doreuses form bean in

25、 correct scopecalls perform(mapping, form, request, response)getcategorylist()returns mapping.findforward(success)forwards result.jspexpands custom tagsdisplays internationalized messages from beanresponse sent to browser pure html looks up serverbean.javamessagesbeanadd result messagesauto populates using bean getters/setters becomes request parametercategory0.value added to form usingloggingform.getcategory(0).setvalue(value)for each one that user has changedcall business logic to change on serverbrowser adds form variables to requestresults.jspif submit, auto populate

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论