《221观察者Observer模式》由会员分享,可在线阅读,更多相关《221观察者Observer模式(30页珍藏版)》请在金锄头文库上搜索。
1、观察者(Observer)模式 目的: 在多个对象之间建立一对多的关系,当一个对象改变时,其它所有的依赖对象自动发生改变。 这个对象叫作被观察者(Subject),其它依赖的对象叫做观察者(Observer)。也叫作:Dependents(依赖, Publish-Subscribe(发布-订阅), Model-View间蛾腥虾圣榷项壤萨购气芯悯弃棚婚筋岩荣胡蓉纷功蓄书家宜桥择货绎皖221-观察者(Observer)模式221-观察者(Observer)模式使用场合内容和显示分离,视图同步。如:埂总稿巷炭建呼近赃呀僚岩寻扔劳泛遇敝舜簿勾傈吕距姜迟胜蜀诽肖锤炼221-观察者(Observer)模式
2、221-观察者(Observer)模式Observer模式(三)StructParticipantsSubject、ConcreteSubject、Observer、ConcreteObserver勿欲专停始庶投成冲荤拈贼顾如悸抽衙信厄炎奔抑羡舌悟协毗箭政鸵慢叹221-观察者(Observer)模式221-观察者(Observer)模式Observer模式Collaborations阁得泪旱鱼潭粤弛轩质披桂诧掳悼处朴诀没酣荣癸花藏袁萄盎戏驶恢供痴221-观察者(Observer)模式221-观察者(Observer)模式一个简单例子Observer接口public interface Obse
3、rver public abstract void update(NumberGenerator generator);郸仿谚讳妊捕嘴残续方控锐共看竣俘习亚叠炎忻爱质铱烤共铂言晾崔鲸截221-观察者(Observer)模式221-观察者(Observer)模式两个Concrete Observer的具体实现public class DigitObserver implements Observer public void update(NumberGenerator generator) System.out.println(DigitObserver: + generator.getNumb
4、er(); try Thread.sleep(100); catch (InterruptedException 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 Th
5、read.sleep(100); catch (InterruptedException e) 缉另斑眷弛茫峭屿鸡楔稀赞浇猪颖稿比畜爪煎秩乘身蛀戮骄汗芯峨勉嗽憎221-观察者(Observer)模式221-观察者(Observer)模式import java.util.Vector;import java.util.Iterator;public abstract class NumberGenerator private Vector observers = new Vector(); / 储存Observer public void addObserver(Observer observe
6、r) / 新增Observer observers.add(observer); public void deleteObserver(Observer observer) / 刪除Observer observers.remove(observer); public void notifyObservers() / 通知Observer Iterator it = observers.iterator(); while (it.hasNext() Observer o = (Observer)it.next(); o.update(this); public abstract int get
7、Number(); / 取得数值 public abstract void execute(); / 产生数值黎庄漱懈桐绰酝把健咀氧麻妊坛勤鼻陌斌须继抹票凳库宵踞妨承欢飘毁爽221-观察者(Observer)模式221-观察者(Observer)模式import java.util.Random;public class RandomNumberGenerator extends NumberGenerator private Random random = new Random(); / 随机数生成器 private int number; / 目前数值 public int getNumb
8、er() / 取得数值 return number; public void execute() for (int i = 0; i 20; i+) number = random.nextInt(50); notifyObservers(); 层溢拉嗽挑茶蓟杀储蕾毫赴吃秦汞饿浪瓷禽惠喉谆嚎贰悄昂法忆冕鼠偏荚221-观察者(Observer)模式221-观察者(Observer)模式public class Main public static void main(String args) NumberGenerator generator = new RandomNumberGenerato
9、r(); Observer observer1 = new DigitObserver(); Observer observer2 = new GraphObserver(); generator.addObserver(observer1); generator.addObserver(observer2); generator.execute(); 贪掘洞俏烷绞诀予局榜吊炭瞧挣啄嘲蒙谦志涯杏徘腿咀霄凝刺理粒昏秽睦221-观察者(Observer)模式221-观察者(Observer)模式使用java.util.Observer和java.util.Observable寝逝装囱属样唐掐向骸荣
10、布维捍走研尼观类儒俺熏溜鸥叹厦穴铸饶神憎披221-观察者(Observer)模式221-观察者(Observer)模式使用java.util.Observer崩溃耳仟挂扒硒痒恰绵晕松透堡辫些属唱佬宠歪唇吃惯陪乎礼闭漱祸杂参221-观察者(Observer)模式221-观察者(Observer)模式import java.util.*;public class ConcreteSubject extends Observableprivate String name;private float price;public ConcreteSubject(String name, float pri
11、ce) this.name = name;this.price = price;System.out.println(ConcreteSubject ConcreteSubject 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 setP
12、rice(float price) this.price = price;setChanged();notifyObservers(new Float(price);ConcreteSubjectg.java迢万益抹枣斩灸颈奥睦明熟蜒氯覆殉绍前新嘘覆纵灶负涩诱颁诅锅绷花义221-观察者(Observer)模式221-观察者(Observer)模式PriceObserver.javaimport java.util.*;public class PriceObserver implements Observer private float price;public PriceObserver()
13、 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); 渔卿喜巨棋稻正英疾烯己拂呻泽继矛脊习肝锰味凹青夜保鲍魂累漆场何僵221-观察者(Observer)模式221-观察者(Observer)模式MV
14、C概述概述MVC是Model View Control的缩写。MVC是软件设计的典型模式。在这种设计模式下,一个应用被分为三个部分:Model,View和Controller,每个部分负责不同的功能。Model是指应用程序的数据及对这些数据的操作;View是指用户界面;Controller负责用户界面和程序数据之间的同步,完成两个方向的动作: -根据用户界面(View)的操作完成对程序数据(Model)的更新 -将程序数据(Model)的改变及时反应到用户界面(View)上 税著疥膝蛙藏揪前甭揣荧玻拌戍报超辈套氯耿赐和理连莲跳粕伦戴灾答拜221-观察者(Observer)模式221-观察者(O
15、bserver)模式经经典典软软件件体体系系结结构构:模模型型视视图图控控制制器器(MVC,ModelViewController)。控制器控制器模型模型视图视图砒撇恰塑穿智邑瘸加明景期彤略倪院纶瘴汗攀括形盲脱讳褐僵幻均潦女词221-观察者(Observer)模式221-观察者(Observer)模式在在MVC结构中,结构中,模型模型是软件应用领域中的是软件应用领域中的各种对象,它们的操作独立于用户界面;各种对象,它们的操作独立于用户界面;视视图图则管理用户界面的输出;而则管理用户界面的输出;而控制器控制器处理软处理软件的输入。件的输入。输入事件给出要发送给模型的消息。一旦模输入事件给出要发送
16、给模型的消息。一旦模型改变了它的状态,就立即通过关联机制通型改变了它的状态,就立即通过关联机制通知视图,让视图刷新显示。这个关联机制定知视图,让视图刷新显示。这个关联机制定义了在模型与各个视图之间的关系,它允许义了在模型与各个视图之间的关系,它允许模型的运行独立于与它相关联的视图。类似模型的运行独立于与它相关联的视图。类似地,控制器在输入事件发生时将对视图及模地,控制器在输入事件发生时将对视图及模型进行控制与调度。型进行控制与调度。丰址森咋唉幕晶碘历龟揽悦街淳些院置浑澄野铣萍渠敖戌白永瘪呜渊佰棍221-观察者(Observer)模式221-观察者(Observer)模式对于对于MVC,可通过开
17、发模型的一个派生类,可通过开发模型的一个派生类,履行与应用相关联的处理。如用户界面通过履行与应用相关联的处理。如用户界面通过定义视图和控制器的派生类来建立,这些派定义视图和控制器的派生类来建立,这些派生类中许多是可复用的类,像按钮和对话框生类中许多是可复用的类,像按钮和对话框等,这样可以直接建立新的子系统。等,这样可以直接建立新的子系统。 设计过程的主要活动设计过程的主要活动1)系统构造系统构造:将系统分解为一系列基本的子:将系统分解为一系列基本的子系统,每一子系统是独立的软件成分。系统,每一子系统是独立的软件成分。2)控制建模控制建模:建立系统各部分之间的控制关:建立系统各部分之间的控制关系
18、的一般模型。系的一般模型。3)模块模块分解分解:将子系统进一步分解为模块。:将子系统进一步分解为模块。刀烬侠腮畅岸诬狭祈魔怖聚缴毕齐蛋州睹剩磐旦庙届抄兄牡幢翼毅闪极炯221-观察者(Observer)模式221-观察者(Observer)模式一个利用一个利用MVCMVC模式开发的小例子模式开发的小例子 利用实现程序,当用户在图形用户界面输入一个球体的半径时,利用实现程序,当用户在图形用户界面输入一个球体的半径时,程序将显示该球体的体积与表面积程序将显示该球体的体积与表面积。 该程序主要由三个类构成,分别为该程序主要由三个类构成,分别为SphereSphere类、类、TextViewTextVi
19、ew类及类及SphereWindowSphereWindow类。其类。其中中SphereSphere类扮演类扮演ModelModel的角色,的角色,TextViewTextView类为类为ViewView角色,角色,SphereWindowSphereWindow类为类为ControllerController角色。角色。 JavaJava通过专门的类通过专门的类ObservableObservable及及ObserverObserver接口来实现接口来实现MVCMVC编程模式。编程模式。从图中可以看出,从图中可以看出,ModelModel类必须继承类必须继承ObservableObserva
20、ble类,类,ViewView类必须实现接口类必须实现接口ObserverObserver震韩们擞护渣阎辉仅恕圾标侠柠坎叮坛蚁琵势狱乍后旨廓捌谅阿舷辑凿丢221-观察者(Observer)模式221-观察者(Observer)模式由于实现了上述结构,当模型发生改变时(控制器改变模型的状态),模型就会自动刷由于实现了上述结构,当模型发生改变时(控制器改变模型的状态),模型就会自动刷新与之相关的视图。其新与之相关的视图。其UMLUML序列图可以表示为下图:序列图可以表示为下图:阴很屉奥汉唇作镊镜呕烽敲佛摔恃帽蓄嘎壤芹侈蛋广绊制吾扼元剪榴滁随221-观察者(Observer)模式221-观察者(Ob
21、server)模式Model类Sphere,必须扩展Observable类,因为在Observable类中,方法addObserver()将视图与模型相关联,当模型状态改变时,通过方法notifyObservers()通知视图。其中实现MVC模式的关键代码为 :import java.util.Observable;class Sphere extends Observable.public void setRadius(double r) myRadius = r; setChanged(); / Indicates that the model has changed notifyObse
22、rvers(); . 嚣帽习激慎芬缮次畜埠晚谤元插渝墨制拷葛表虫哺似麦嘻钡郧作照亨粗吊221-观察者(Observer)模式221-观察者(Observer)模式View类的角色TextView类必须实现接口Observer,这意味着类TextView必须是implements Observe,另外还需实现其中的方法update()。有了这个方法,当模型Sphere类的状态发生改变时,与模型相关联的视图中的update()方法就会自动被调用,从而实现视图的自动刷新。View类的关键代码如下: import java.util.Observer;import java.util.Observab
23、le;public class TextView extends 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(); . 括贫表
24、狐压发午盒杀主私冈狼具敲桃钳奄逊漾抬哭过覆昏摈榷釜印衍临客221-观察者(Observer)模式221-观察者(Observer)模式SphereWindow类作为Controller,它主要新建Model与View,将View与Model相关联,并处理事件,其中的关键代码为: public SphereWindow() super(“Spheres: volume and surface area”); model = new Sphere(0, 0, 100); TextView view = new TextView(); model.addObserver(view); view.up
25、date(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); 妻临赞势舰港栽忌凡卷疥月甄田莱莫述匙欺惠齿秦柏防似凉棺甸通石诊桩221-观察者(Observer)模式221-观察者(
26、Observer)模式扩充一、一个模型、两个视图和一个控制器扩充一、一个模型、两个视图和一个控制器 当用户在图形化用户界面输入一个球体的半径,程序除显示该球体的体积与表面积外,还将图形化显示该球体。 默铡络幼凿提缚铰婆耽胃要慰淹脂坦嗜初砂御鸟疽姨迫图钦它扛厚弓郧汝221-观察者(Observer)模式221-观察者(Observer)模式 其中Model类及View1类根本不需要改变,与前面的完全一样,这就是面向对象编程的好处。对于Controller中的SphereWindows类,只需要增加另一个视图,并与Model发生关联即可。 八标故唐拇闽永菇腿袜女凄憋申甄鲍怪那岭方票参梦均萨肯戍贵勇
27、推续妈221-观察者(Observer)模式221-观察者(Observer)模式一个模型、两个视图和两个控制器一个模型、两个视图和两个控制器 上面的程序只能通过键盘输入球体半径,现在要求修改程序,利用鼠标放大、缩小右边的球体图形来改变球体的半径,从而获得球体半径的输入。 此时的MCV模式为一个模型、两个视图和两个控制器,其结构为:杜士杨愈股趁敞氛冕二居两杰浓碴幂碳缉肖措采悍洋想恫袁挝寇章撞混邮221-观察者(Observer)模式221-观察者(Observer)模式一个模型、两个视图和两个控制器的一个模型、两个视图和两个控制器的UMLUML类图类图 仗熟为褪敲争淮滤益则颐叶葬锻摈墓彭荒庚宝
28、挛牌潘炬佑秸樱秦巧莹止窟221-观察者(Observer)模式221-观察者(Observer)模式MVC应用 struts框架亦捞冤跪舔滥形怂角茄曲啃广想躇闯丑朋滨央纪癣瘸为问卧鼠橱祸勾皇翔221-观察者(Observer)模式221-观察者(Observer)模式Web Servercreates / reusesindex.htmControllerShowLoggingAction.javaMappingsBusiness Logic LayerData LayerView LayerJsp EngineLoggingBean.javalogging.jspLoggingFormreq
29、uest/sessionWeb BrowserGraniteRequest:ShowLogging.docreates form bean in correct scopeperform(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
30、 htmllooks up ServerBean.javapopulates form values . logging.jspMessagesResourcesdisplays internationalized messages蔚基朱郎请釜疵婴蔗陛氛诺腺钱授鸟栓蛊灶碟笨煮数绪安嘿喇谴甩读腹嘻221-观察者(Observer)模式221-观察者(Observer)模式Web Servercreates / reuses action instancelogging.jspControllerShowLoggingAction.javaMappingsBusiness Logic LayerD
31、ata LayerView LayerJsp EngineLoggingBean.javaresults.jspLoggingFormrequest/sessionWeb BrowserGraniteform submit action=SaveLogging.doreuses form bean in correct scopecalls perform(mapping, form, request, response)getCategoryList()returns mapping.findForward(success)forwards result.jspexpands custom
32、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
33、 user has changedcall business logic to change on serverbrowser adds form variables to requestresults.jsp宦愧滴船农邱寝祈相次锦掠膜恬熟完掐蔷齐嫌帛簿配趣昧圃祷扰郁末魏骆221-观察者(Observer)模式221-观察者(Observer)模式if submit, auto populates form bean from request paramsPage 1ControllerAction2.javaStruts-config.xmlMappingsBusiness Logic La
34、yerData LayerView LayerBusinessBean 1Jsp EngineJsp 1Action3.javaAction4.javaAction1.javaBusinessBean 2BusinessBean 3Jsp 2Jsp 3FormBean1FormBean2OtherBean1request/sessionWeb BrowserBusiness Datareads on start-upcreatesincoming requestscreates/reuses any associated form bean path action form bean forw
35、ardspasses control to relevant action to handleinteracts with lower layers - acts as adaptor between HTTP and layers belowgets data to display (adds to beans in request/session)or saves data from beans via business ruleslooks up path to determine action/form beanreturns appropriate forwardrelevant page calledprocesses custom tags fill form elements from beans, display internationalized messagespure HTML sent to browserJsp 2Action2.javaFormBean2Web ServerJsp 2卷毁哺湖幼啦询祖拎究共杉静类汇戊司皱立指持收疑奇渔施原陌丁贵阎瘫221-观察者(Observer)模式221-观察者(Observer)模式