观察者(Observer)模式.ppt

上传人:小飞机 文档编号:6200226 上传时间:2023-10-04 格式:PPT 页数:30 大小:268KB
返回 下载 相关 举报
观察者(Observer)模式.ppt_第1页
第1页 / 共30页
观察者(Observer)模式.ppt_第2页
第2页 / 共30页
观察者(Observer)模式.ppt_第3页
第3页 / 共30页
观察者(Observer)模式.ppt_第4页
第4页 / 共30页
观察者(Observer)模式.ppt_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《观察者(Observer)模式.ppt》由会员分享,可在线阅读,更多相关《观察者(Observer)模式.ppt(30页珍藏版)》请在三一办公上搜索。

1、观察者(Observer)模式,目的:在多个对象之间建立一对多的关系,当一个对象改变时,其它所有的依赖对象自动发生改变。这个对象叫作被观察者(Subject),其它依赖的对象叫做观察者(Observer)。也叫作:Dependents(依赖,Publish-Subscribe(发布-订阅),Model-View,使用场合,内容和显示分离,视图同步。如:,Observer模式(三),StructParticipantsSubject、ConcreteSubject、Observer、ConcreteObserver,Observer模式,Collaborations,一个简单例子,Observe

2、r接口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(InterruptedExce

3、ption 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+)(*);();try Thread.sleep(100);catch(InterruptedException e),import;import;public abstract class NumberGenerator p

4、rivate Vector observers=new Vector();/储存Observer public void addObserver(Observer observer)/新增Observer observers.add(observer);public void deleteObserver(Observer observer)/刪除Observer observers.remove(observer);public void notifyObservers()/通知Observer Iterator it=observers.iterator();while(it.hasNex

5、t()Observer o=(Observer)it.next();o.update(this);public abstract int getNumber();/取得数值 public abstract void execute();/产生数值,import;public class RandomNumberGenerator extends NumberGenerator private Random random=new Random();/随机数生成器 private int number;/目前数值 public int getNumber()/取得数值 return number;

6、public void execute()for(int i=0;i 20;i+)number=random.nextInt(50);notifyObservers();,public class Main public static void main(String args)NumberGenerator generator=new RandomNumberGenerator();Observer observer1=new DigitObserver();Observer observer2=new GraphObserver();generator.addObserver(observ

7、er1);generator.addObserver(observer2);generator.execute();,使用和,使用,import java.util.*;public class ConcreteSubject extends Observableprivate String name;private float price;public ConcreteSubject(String name,float price)this.name=name;this.price=price;System.out.println(ConcreteSubject ConcreteSubjec

8、t created:+name+at+price);public String getName()return name;public float getPrice()return price;public void setName(String name)this.name=name;setChanged();notifyObservers(name);public void setPrice(float price)this.price=price;setChanged();notifyObservers(new Float(price);,ConcreteSubjectg.java,Pr

9、iceObserver.java,import java.util.*;public class PriceObserver 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();Sys

10、tem.out.println(PriceObserver:+price);,MVC概述,MVC是Model View Control的缩写。MVC是软件设计的典型模式。在这种设计模式下,一个应用被分为三个部分:Model,View和Controller,每个部分负责不同的功能。Model是指应用程序的数据及对这些数据的操作;View是指用户界面;Controller负责用户界面和程序数据之间的同步,完成两个方向的动作:-根据用户界面(View)的操作完成对程序数据(Model)的更新-将程序数据(Model)的改变及时反应到用户界面(View)上,经典软件体系结构:模型视图控制器(MVC,M

11、odelViewController)。,在MVC结构中,模型是软件应用领域中的各种对象,它们的操作独立于用户界面;视图则管理用户界面的输出;而控制器处理软件的输入。输入事件给出要发送给模型的消息。一旦模型改变了它的状态,就立即通过关联机制通知视图,让视图刷新显示。这个关联机制定义了在模型与各个视图之间的关系,它允许模型的运行独立于与它相关联的视图。类似地,控制器在输入事件发生时将对视图及模型进行控制与调度。,对于MVC,可通过开发模型的一个派生类,履行与应用相关联的处理。如用户界面通过定义视图和控制器的派生类来建立,这些派生类中许多是可复用的类,像按钮和对话框等,这样可以直接建立新的子系统。

12、设计过程的主要活动系统构造:将系统分解为一系列基本的子系统,每一子系统是独立的软件成分。控制建模:建立系统各部分之间的控制关系的一般模型。模块分解:将子系统进一步分解为模块。,一个利用MVC模式开发的小例子 利用实现程序,当用户在图形用户界面输入一个球体的半径时,程序将显示该球体的体积与表面积。,该程序主要由三个类构成,分别为Sphere类、TextView类及SphereWindow类。其中Sphere类扮演Model的角色,TextView类为View角色,SphereWindow类为Controller角色。,Java通过专门的类Observable及Observer接口来实现MVC编程

13、模式。,从图中可以看出,Model类必须继承Observable类,View类必须实现接口Observer,由于实现了上述结构,当模型发生改变时(控制器改变模型的状态),模型就会自动刷新与之相关的视图。其UML序列图可以表示为下图:,Model类Sphere,必须扩展Observable类,因为在Observable类中,方法addObserver()将视图与模型相关联,当模型状态改变时,通过方法notifyObservers()通知视图。其中实现MVC模式的关键代码为:import;class Sphere extends Observable.public void setRadius(d

14、ouble r)myRadius=r;setChanged();/Indicates that the model has changed notifyObservers();.,View类的角色TextView类必须实现接口Observer,这意味着类TextView必须是implements Observe,另外还需实现其中的方法update()。有了这个方法,当模型Sphere类的状态发生改变时,与模型相关联的视图中的update()方法就会自动被调用,从而实现视图的自动刷新。View类的关键代码如下:import;import;public class TextView extends

15、 JPanel implements Observer.public void update(Observable o,Object arg)Sphere balloon=(Sphere)o;radiusIn.setText(“”+f3.format(balloon.getRadius();volumeOut.setText(“”+f3.format(balloon.volume();surfAreaOut.setText(“”+f3.format(balloon.surfaceArea();.,SphereWindow类作为Controller,它主要新建Model与View,将View与M

16、odel相关联,并处理事件,其中的关键代码为:public SphereWindow()super(“Spheres:volume and surface area”);model=new Sphere(0,0,100);TextView view=new TextView();model.addObserver(view);view.update(model,null);view.addActionListener(this);Container c=getContentPane();c.add(view);public void actionPerformed(ActionEvent e)

17、JTextField t=(JTextField)e.getSource();double r=Double.parseDouble(t.getText();model.setRadius(r);,扩充一、一个模型、两个视图和一个控制器 当用户在图形化用户界面输入一个球体的半径,程序除显示该球体的体积与表面积外,还将图形化显示该球体。,其中Model类及View1类根本不需要改变,与前面的完全一样,这就是面向对象编程的好处。对于Controller中的SphereWindows类,只需要增加另一个视图,并与Model发生关联即可。,一个模型、两个视图和两个控制器 上面的程序只能通过键盘输入球体

18、半径,现在要求修改程序,利用鼠标放大、缩小右边的球体图形来改变球体的半径,从而获得球体半径的输入。此时的MCV模式为一个模型、两个视图和两个控制器,其结构为:,一个模型、两个视图和两个控制器的UML类图,MVC应用 struts框架,creates/reuses,index.htm,Controller,ShowLoggingAction.java,Mappings,Business Logic Layer,Data Layer,View Layer,Jsp Engine,LoggingBean.java,logging.jsp,LoggingForm,request/session,Web

19、Browser,Granite,Request:ShowLogging.do,creates form bean in correct scope,perform(mapping,form,request,response),calls business logic ruleto get logging info,returns forward(success),mainpulates data,setCategoryList(list),forwards logging.jsp,expands custom tags,response sent to browser pure html,Se

20、rverBean.java,logging.jsp,displays internationalized messages,creates/reuses action instance,logging.jsp,Controller,ShowLoggingAction.java,Mappings,Business Logic Layer,Data Layer,View Layer,Jsp Engine,LoggingBean.java,results.jsp,LoggingForm,request/session,Web Browser,Granite,form submit action=Sa

21、veLogging.do,reuses form bean in correct scope,calls perform(mapping,form,request,response),getCategoryList(),returns mapping.findForward(success),forwards result.jsp,expands custom tags,Displays internationalized messages from bean,response sent to browser pure html,ServerBean.java,MessagesBean,add

22、 result messages,For each one that user has changed,call business logic to change on server,browser adds form variables to request,results.jsp,if submit,auto populates form bean from request params,Page 1,Controller,Action2.java,Struts-config.xml,Mappings,Business Logic Layer,Data Layer,View Layer,B

23、usinessBean 1,Jsp Engine,Jsp 1,Action3.java,Action4.java,Action1.java,BusinessBean 2,BusinessBean 3,Jsp 2,Jsp 3,FormBean1,FormBean2,OtherBean1,request/session,Web Browser,Business Data,reads on start-up,creates,incoming requests,creates/reuses any associated form bean,path action form bean forwards,

24、passes control to relevant action to handle,interacts with lower layers-acts as adaptor between HTTP and layers below,gets data to display(adds to beans in request/session)or saves data from beans via business rules,looks up path to determine action/form bean,returns appropriate forward,relevant page called,processes custom tags fill form elements from beans,display internationalized messages,pure HTML sent to browser,Jsp 2,Jsp 2,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号