观察者(Observer)模式与MVC
设计模式之Observer

设计模式之ObserverObserver设计模式的简介:Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Observer(观察者)模式是比较常用的一个模式,尤其在界面设计中应用广泛,而本站所关注的是Java在电子商务系统中应用,因此想从电子商务实例中分析Observer的应用.虽然网上商店形式多样,每个站点有自己的特色,但也有其一般的共性,单就"商品的变化,以便及时通知订户"这一点,是很多网上商店共有的模式,这一模式类似Observer patern.具体的说,如果网上商店中商品在名称价格等方面有变化,如果系统能自动通知会员,将是网上商店区别传统商店的一大特色.这就需要在商品product中加入Observer这样角色,以便product细节发生变化时,Observer能自动观察到这种变化,并能进行及时的update或notify动作.一:①项目分析(analyse):需求:确定要实现的功能。
比如:动画形式、命令行形式等等。
这个部分需要向客户确定要做成什么样的,根据客户的需求做决定。
可有时客户也不清楚到底要什么,这时需要自己的经验分析能达到什么样的效果。
②项目设计(design):设计:有一个功能,这个功能要怎么样去实现。
达成同样的功能,使用各种各样不同的方法。
二:问题请模拟下列情形:①小孩在睡觉;②醒来后要求吃东西,有一个人需要喂孩子吃。
简单的代码实现如下:以上代码有问题,class Parent这个类要每隔一秒监视一下class Child这个类,Parent这个类无端消耗CPU,而且不能再干其它事情,浪费资源。
我们需要对这段代码进行改进,以达到更加优良的性能。
大概思路:不要Parent这个类每秒监听一下Child这个类,而是Child这个类单独作为一个线程,来监听Parent,一旦Child醒来,就立即通知Parent这个类,然后实现Parent自己的功能。
MVC、MVP、MVVM三种区别及适用场合

MVC、MVP、MVVM三种区别及适⽤场合本⽂将详细阐述以下MVC、MVP、MVVM三种理念的定义及区别还有他们的适⽤场合。
MVCMVC模式最初⽣根于服务器端的Web开发,后来渐渐能够胜任客户端Web开发,能够满⾜其复杂性和丰富性。
MVC是Model-View-Controller的缩写,它将应⽤程序划分为三个部分:Model: 模型(⽤于封装与应⽤程序的业务逻辑相关的数据以及对数据的处理⽅法)View: 视图(渲染页⾯)Controller: 控制器(M和V之间的连接器,⽤于控制应⽤程序的流程,及页⾯的业务逻辑)MVC特点:MVC模式的特点在于实现关注点分离,即应⽤程序中的数据模型与业务和展⽰逻辑解耦。
在客户端web开发中,就是将模型(M-数据、操作数据)、视图(V-显⽰数据的HTML元素)之间实现代码分离,松散耦合,使之成为⼀个更容易开发、维护和测试的客户端应⽤程序。
View 传送指令到 Controller ;Controller 完成业务逻辑后,要求 Model 改变状态;Model 将新的数据发送到 View,⽤户得到反馈。
MVC流程:MVC流程⼀共有两种,在⽇常开发中都会使⽤到。
⼀种是通过 View 接受指令,传递给 Controller,然后对模型进⾏修改或者查找底层数据,最后把改动渲染在视图上。
另⼀种是通过controller接受指令,传给Controller:MVC优点:耦合性低,视图层和业务层分离,这样就允许更改视图层代码⽽不⽤重新编译模型和控制器代码。
重⽤性⾼⽣命周期成本低MVC使开发和维护⽤户接⼝的技术含量降低可维护性⾼,分离视图层和业务逻辑层也使得WEB应⽤更易于维护和修改部署快MVC缺点:不适合⼩型,中等规模的应⽤程序,花费⼤量时间将MVC应⽤到规模并不是很⼤的应⽤程序通常会得不偿失。
视图与控制器间过于紧密连接,视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应⽤是很有限的,反之亦然,这样就妨碍了他们的独⽴重⽤。
observer方法

observer方法Observer方法,也称为观察者模式,是一种软件设计模式,旨在使对象之间的变化自动通知其相关对象,而不需要直接的耦合。
在这种模式下,一个对象(通常是主题或发布者)维护一个由许多其他对象(观察者或订阅者)组成的列表,该列表保持更新,以便在主题状态发生变化时自动通知观察者对象。
这种模式可以在许多不同的环境中使用,并且已被证明是提高代码的可读性和可维护性的重要工具。
如何使用observer方法Observer方法可以通过简单的6步过程来使用:1. 定义主题。
主题的作用是维护一个当前状态,并能够通知所有观察者任何更改。
主题通常具有添加和删除观察者的方法,以及通知所有观察者的方法。
2. 定义观察者。
观察者的作用是接收主题通知,并作出相应的响应。
观察者通常具有update方法,该方法接收当前主题状态作为参数。
3. 如果您使用的被观察者对象已经存在,则将其更改为被观察者。
否则,可以轻松地创建具有被观察者属性的类,并且在观察者与主题之间使用该属性来保持通信。
4. 将所有观察者注册到主题中。
反之,您应该使用主题的注册方法将它们添加到列表中。
5. 实现主题状态更改的行为。
例如,可以添加一个setter方法,以便将更改状态后通知所有观察者。
6. 实现观察者的反应。
根据情况,观察者可能选择使用更改的状态进行计算,更新其自己的状态,或者执行其他必要的操作。
观察者模式的优点Observer方法有以下几个主要优点:1. 可扩展性。
由于观察者模式是松耦合的,因此在需要添加或移除观察者时非常灵活。
添加新观察者或删除现有观察者不需要更改主题或观察者的现有代码,因此添加和删除观察者可以在运行时执行。
2. 可重用性。
观察者模式使得可以将同样的观察者应用于多个主题,而不需要每次都重新编写代码。
3. 易于维护。
由于观察者模式模块化,因此在代码中更容易隔离和测试各个组件。
4. 易于实现。
观察者模式的实现通常是简单,易于理解和实现。
MVC设计模式范文

MVC设计模式范文MVC(Model–View–Controller)是一种软件设计模式,用于将应用程序的不同部分分离,从而提高代码的可维护性和可重用性。
MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller),每个组件都有不同的责任和功能。
模型(Model)是应用程序的数据和业务逻辑层。
它负责管理数据的获取、存储和处理,并提供对数据的操作方法。
模型通常包含实体类、数据访问对象和业务逻辑对象。
实体类表示数据的结构和属性,数据访问对象用于与数据库进行交互,业务逻辑对象则处理数据的业务逻辑。
模型可以独立于其他组件进行测试和修改,使得应用程序的数据层更加灵活和可扩展。
视图(View)是应用程序的用户界面层。
它负责展示数据给用户,并接收用户的输入。
视图可以是图形界面、命令行界面或者其他形式的界面。
视图通常是被动的,它根据模型的数据来更新自己的显示内容,并将用户的输入传递给控制器进行处理。
视图可以独立于数据和业务逻辑进行修改,使得应用程序的界面更加灵活和可定制。
控制器(Controller)是应用程序的逻辑处理层。
它负责接收用户的输入,并根据输入来更新模型和视图。
控制器将用户的请求转发给模型进行处理,并根据模型的结果更新视图的显示内容。
控制器可以处理用户的多个请求,并协调模型和视图之间的交互。
控制器可以独立于用户界面进行测试和修改,使得应用程序的逻辑层更加灵活和可重用。
MVC模式的优势在于它将应用程序的不同部分分离,使得每个部分都可以独立进行测试、修改和扩展。
模型、视图和控制器的分离也使得应用程序的开发过程更加协调和高效。
开发人员可以专注于自己的领域,而不需要关注其他部分的实现细节。
此外,MVC模式还促进了代码的重用,因为每个部分都可以独立进行修改和替换。
然而,MVC模式也存在一些挑战和限制。
首先,MVC模式的实现可能会增加代码的复杂性和开发时间。
需要设计和实现模型、视图和控制器之间的交互机制和通信方式。
Spring Mvc 课件

可适配、非侵入:可以根据不同的应用场景,选择合适 的控制器子类 (simple型、command型、form型、wizard 型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承。
业务模型还有一个很重要的模型那就是数据模型。数据模型主 要指实体对象的数据保存(持续化)。比如将一张订单保存到数据 库,从数据库获取订单。我们可以将这个模型单独列出,所有有关 数据库的操作只限制在该模型中。
第六页,共62页。
MVC设计(shèjì)思想
控制(Controller)可以理解为从用户接收请求, 将模型与 视图匹配在一起,共同完成用户的请求。划分控制层的作用也 很明显,它清楚地告诉你,它就是一个(yī ɡè)分发器,选择 什么样的模型,选择什么样的视图,可以完成什么样的用户请 求。控制层并不做任何的数据处理。
❖ 如果不作其它配置,会加载默认(mòrèn)组件
第二十一页,共62页。
在web.xml配DispatcherServlet
web.xml
…
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
第十五页,共62页。
Spring MVC 特点(tèdiǎn)
可定制的本地化和主题(theme)解析:支持在JSP中可选择 地使用Spring标签库、支持JSTL、支持Velocity(不需要 (xūyào)额外的中间层)等等。
设计模式考试复习试题[含答案解析]
![设计模式考试复习试题[含答案解析]](https://img.taocdn.com/s3/m/df74e5c7551810a6f52486ad.png)
一、1. 设计模式一般用来解决什么样的问题: A.同一问题的不同表相2. 下列属于面向对象基本原则的是: C.里氏代换3. Open-Close原则的含义是一个软件实体:A.应当对扩展开放,对修改关闭.4. 当我们想创建一个具体的对象而又不希望指定具体的类时,使用(A)模式。
A.创建型5. 要依赖于抽象不要依赖于具体。
即针对接口编程不要针对实现编程:(D)依赖倒转原则6. 依据设计模式思想,程序开发中应优先使用的是( A )关系实现复用。
A, 委派7. 设计模式的两大主题是( D ) D.系统复用与系统扩展8. 单体模式中,两个基本要点(AB)和单体类自己提供单例A .构造函数私有 B.唯一实例9. 下列模式中,属于行为模式的是( B ) B观察者10. “不要和陌生人说话”是( D )原则的通俗表述 D.迪米特1. 软件体系结构是指一个系统的有目的的设计和规划,这个设计规划既不描述活动,也不描述系统怎样开发,它只描述系统的组成元素及其相互的交互协作。
2.一个UML模型只描述了一个系统要做什么,它并没告诉我们系统是怎么做。
3.接口是可以在整个模型中反复使用的一组行为,是一个没有属性而只有方法的类。
4.多重性指的是,某个类有多个对象可以和另一个类的一对象关联。
5.当一个类的对象可以充当多种角色时,自身关联就可能发生。
6.在泛化关系中,子类可以替代父类。
后前者出现的可以相同地方。
反过来却不成立。
7.最通常的依赖关系是一个类操作的形构中用到了另一个类的定义。
8.组成是强类型的聚集,因为聚集中的每个部分体只能属于一个整体。
9.实现的符号和继承的符号有相似之处,两者的唯一差别是实现关系用虚线表示,继承关系用实线表示。
10. 设计模式中应优先使用对象组合而不是类继承。
1.适配器模式属于创建型模式结构型( F )2.在设计模式中,“效果”只是指“原因和结果”( T )3.设计模式使代码编制不能真正工程化( T )4.面向对象语言编程中的异常处理,可以理解为责任链模式(T )5.反模式就是反对在软件开发过程中使用设计模式分析:反模式用来解决问题的带有共性的不良方法(F )1.什么是设计模式?设计模式目标是什么?答:设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
MVC设计模式简介
MVC设计模式简介MVC简介MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是⼀种软件设计典范。
它是⽤⼀种业务逻辑、数据与界⾯显⽰分离的⽅法来组织代码,将众多的业务逻辑聚集到⼀个部件⾥⾯,在需要改进和个性化定制界⾯及⽤户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。
MVC开始是存在于桌⾯程序中的,M是指业务模型,V是指⽤户界⾯,C则是控制器。
使⽤的MVC的⽬的:在于将M和V的实现代码分离,从⽽使同⼀个程序可以使⽤不同的表现形式。
⽐如Windows系统资源管理器⽂件夹内容的显⽰⽅式,下⾯两张图中左边为详细信息显⽰⽅式,右边为中等图标显⽰⽅式,⽂件的内容并没有改变,改变的是显⽰的⽅式。
不管⽤户使⽤何种类型的显⽰⽅式,⽂件的内容并没有改变,达到M和V分离的⽬的。
在⽹页当中,V即View视图是指⽤户看到并与之交互的界⾯。
⽐如由html元素组成的⽹页界⾯,或者软件的客户端界⾯。
MVC的好处之⼀在于它能为应⽤程序处理很多不同的视图。
在视图中其实没有真正的处理发⽣,它只是作为⼀种输出数据并允许⽤户操纵的⽅式。
M即model模型是指模型表⽰业务规则。
在MVC的三个部件中,模型拥有最多的处理任务。
被模型返回的数据是中⽴的,模型与数据格式⽆关,这样⼀个模型能为多个视图提供数据,由于应⽤于模型的代码只需写⼀次就可以被多个视图重⽤,所以减少了代码的重复性。
C即controller控制器是指控制器接受⽤户的输⼊并调⽤模型和视图去完成⽤户的需求,控制器本⾝不输出任何东西和做任何处理。
它只是接收请求并决定调⽤哪个模型构件去处理请求,然后再确定⽤哪个视图来显⽰返回的数据。
下图说明了三者之间的调⽤关系。
⽤户⾸先在界⾯中进⾏⼈机交互,然后请求发送到控制器,控制器根据请求类型和请求的指令发送到相应的模型,模型可以与数据库进⾏交互,进⾏增删改查操作,完成之后,根据业务的逻辑选择相应的视图进⾏显⽰,此时⽤户获得此次交互的反馈信息,⽤户可以进⾏下⼀步交互,如此循环。
三层架构与MVC的区别
三层架构与MVC的区别我们平时总是将混为⼀谈,殊不知它俩并不是⼀个概念。
下⾯我来为⼤家揭晓我所知道的⼀些真相。
⾸先,它俩根本不是⼀个概念。
三层架构是⼀个分层式的软件体系架构设计,它可适⽤于任何⼀个项⽬。
MVC是⼀个设计模式,它是根据项⽬的具体需求来决定是否适⽤于该项⽬。
那么架构跟设计模式有什么区别呢? 我们从接⼿⼀个项⽬开始,⾸先,我们需要进⾏架构设计,⼀般我们采⽤的就是分层式的架构设计,即我们的三层架构。
然后,在确定了架构以后,我们再根据项⽬的具体需求去考虑是否需要应⽤⼀些设计模式,⽐如是否应⽤我们的MVC模式,抽象⼯⼚模式等等。
(在这⾥我们看出,MVC与三层架构不是⼀个等级的,⽽与抽象⼯⼚等设计模式才是⼀路的) 最后,确定了模式以后,就是我们的⼀些具体的实现了。
(当然⼀个项⽬不仅仅考虑这些问题,我只是为了说明两者的区别,将其他问题已省略)其次,它俩划分的层次不同。
三层架构将整个项⽬划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
MVC 即Model(模型),View(视图),Controller(控制)。
下⾯看⼀下他俩的区别与联系: 通过这个图我们可以知道,我们平常所说的V是UI,C是BLL,M是DAL的观点是错误的。
⽽我们通常所见到的MVC⼀般也都是在应⽤三层架构的基础上,即将Model层再进⾏分层。
⽽如果Model不再进⾏划分的话,那么使⽤MVC的意义也就不⼤了。
然后,它俩的⽬的着重点不同。
三层架构的⽬的着重点是“⾼内聚,低耦合”,即解耦。
MVC的⽬的则是实现Web系统的职能分⼯,即职责划分。
其实职责划分也是解耦,但是三层侧重的是整体的⼀个解耦,⽽MVC侧重的是web系统的解耦,即侧重jsp和Servlet的⼀个解耦。
最后,为何我们会将其混为⼀谈? 既然两者有这么多的不同,我们为什么还总是将其混淆呢,下⾯我列举了⼏个我们常常将其混为⼀谈的⼏个原因: 1.⼆者都是“三层”。
java设计模式选择题复习
工厂系列模式的优缺点:1.让用户的代码和某个特定类的子类的代码解耦用户不必知道它所使用的对象是怎样创建的,只需知道该对象有哪些方法2.抽象工厂模式可以为用户创建一系列相关的对象,使用户和创建这些对象的类脱耦MVC模式是不是一种设计模式?为什么MVC不是设计模式,应该是框架/架构模式,因为它的定义是抽象的,没有足够的细节描述使你直接去实现,而只能根据MVC的概念和思想,用几个设计模式组合实现。
举出一个生活中使用装饰者模式的例子,用程序实现思路举个生活中的例子,俗话说“人在衣着马在鞍”,把这就话用装饰者模式的语境翻译一下,“人通过漂亮的衣服装饰后,男人变帅了,女人变漂亮了;”。
对应上面的类图,这里人对应于ConcreteComponent,而漂亮衣服则对应于ConcreteDecorator;设计模式如何分类,每一个类别都有什么特征?设计模式分为3类,分别是:创建型模式、行为型模式、结构型模式。
创建型特点:避免用户直接使用new运算符创建对象。
行为型特点:怎样合理的设计对象之间的交互通信,以及怎样合理的为对象分配职结构型特点:主要用于处理类或对象的组合Java jdk中使用了哪些设计模式1.单例2.静态工厂3.工厂方法4.抽象工厂5.构造者6.原型7.适配器8桥接9.组合10.装饰器11.外观12.享元14.代理15.迭代器16.观察者17.协调者18.模板方法19.策略20.责任链21.命令22.空对象25.解释器面向对象的设计原则有哪些?开闭原则、面向抽象的原则(依赖倒转原则)、多用组合少用继承原则、高内聚-低耦合原则。
观察者模式的推拉有什么不同?使用场景推,具体主题将变化后的数据全部交给具体观察者。
场景:当具体主题认为具体观察者需要这些变换后的数据时,往往采用推数据方式;拉,具体主题不将变化后的数据交给具体观察者,而是提供获得这些数据的方法。
场景:当具体主题不知道具体观察者是否需要这些变换后的数据时,往往采用拉数据的方式。
mvc与mvp的区别
mvc与mvp的区别在我工作中经常需要处理一些由于开发人员没能很清楚地理解MVC和MVP模式的区别的情况下使用它们而产生的问题。
在这篇文章中我将会阐述一下我对两者之间区别的一些理解。
在N层体系结构中MVC/P模式仅仅只是用于表示层(presentation layer),理解这一点很重要。
这两个模式并不是关于怎么构建数据层(data layer)和服务层(service layer)的,而是关于怎么将数据(data)从用户接口(view)中分离出来,以及用户接口如何与数据进行交互的。
这些模式的使用让解除你的程序中表示层对对数据和控制逻辑的依赖,从而可以自由的变更表示层。
这两种模式中三个部分的一般理解1、模型(Model)表示数据模型和业务逻辑(business logic)。
模型并不总是DataSet,DataTable之类的东西,它代表着一类组件(components)或类(class),这些组件或类可以向外部提供数据,同时也能从外部获取数据并将这些数据存储在某个地方。
简单的理解,可以把模型想象成“外观类(facade class)”。
【译注:这里的外观是指“外观模式”中所说的外观。
外观的一般作用是为一个复杂的子系统提供高层次的简单易用的访问接口,可以参看下面的图来理解它的原理:】2、视图(View)将数据层现给用户。
一般的视图都只是包含用户界面(UI),而不包含界面逻辑。
比如,中包含控件的页面(page)就是一个视图。
视图可以从模型中读取数据,但是不能修改或更新模型。
3、层现器(Presenter)/控制器(Controller)包含了根据用户在视图中的行为去更新模型的逻辑。
视图仅仅只是将用户的行为告知控制器,而控制器负责从视图中取得数据然后发送给模型。
MVC/P模式的核心是为了将模型从视图/控制器中分离出来,从而使得模型独立于它们,因此模型不包含对视图和控制的引用。
什么是MVC(Model View Presenter)模式?1、为了使得视图接口可以与模型和控制器进行交互,控制器执行一些初始化事件2、用户通过视图(用户接口)执行一些操作3、控制器处理用户行为(可以用观察着模式实现)并通知模型进行更新4、模型引发一些事件,以便将改变发告知视图5、视图处理模型变更的事件,然后显示新的模型数据6、用户接口等待用户的进一步操作这一模式的有一下几个要点:1、视图并不使用控制器去更新模型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public class Main { public static void main(String[] args) { NumberGenerator generator = new RandomNumberGenerator(); Observer observer1 = new DigitObserver(); Observer observer2 = new GraphObserver(); generator.addObserver(observer1); generator.addObserver(observ
View类的角色TextView类必须实现接口Observer,这意味着类TextView必须 是implements Observe,另外还需实现其中的方法update()。有了这个方法,当 模型Sphere类的状态发生改变时,与模型相关联的视图中的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())); volumeOut.setText(“ ”+f3.format(balloon.volume())); surfAreaOut.setText(“ ” + f3.format(balloon.surfaceArea())); } ...... }
使用场合
• 内容和显示分离,视图同步。如:
Observer模式(三)
• Struct
• Participants
– Subject、ConcreteSubject、Observer、 ConcreteObserver
Observer模式
• Collaborations
一个简单例子
• Observer接口 public interface Observer { public abstract void update(NumberGenerator generator); }
-根据用户界面(View)的操作完成对程序数据(Model)的更新 -将程序数据(Model)的改变及时反应到用户界面(View)上
•
经 典 软 件 体 系 结 构 :模 型 / 视 图 / 控 制 器 (MVC,Model/View/Controller)。
视图
模型 控制器
•
在MVC结构中,模型是软件应用领域中的 各种对象,它们的操作独立于用户界面;视 图则管理用户界面的输出;而控制器处理软 件的输入。
从图中可以看出,Model类必须继承Observable类,View类必须实现接口 Observer
由于实现了上述结构,当模型发生改变时(控制器改变模型的状态),模型就会自动刷 新与之相关的视图。其UML序列图可以表示为下图:
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 notifyObservers(); } .... }
一个利用MVC模式开发的小例子 -利用Java实现程序,当用户在图形用户界面输入一个球体的半径时, 程序将显示该球体的体积与表面积。
该程序主要由三个类构成,分别为Sphere类、TextView类及SphereWindow类。其 中Sphere类扮演Model的角色,TextView类为View角色,SphereWindow类为 Controller角色。 Java通过专门的类Observable及Observer接口来实现MVC编程模式。
观察者(Observer)模式
• 目的: 在多个对象之间建立一对多的关系,当一 个对象改变时,其它所有的依赖对象自动 发生改变。 这个对象叫作被观察者(Subject),其它 依赖的对象叫做观察者(Observer)。 也叫作:Dependents(依赖, PublishSubscribe(发布-订阅), Model-View
PriceObserver.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(); System.out. println("PriceObserver : " + price); } } }
MVC概述
•MVC是Model View Control的缩写。 •MVC是软件设计的典型模式。 •在这种设计模式下,一个应用被分为三个部分: Model,View和Controller,每个部分负责不同的功能。 •Model是指应用程序的数据及对这些数据的操作;View 是指用户界面;Controller负责用户界面和程序数据之 间的同步,完成两个方向的动作:
import java.util.Random; public class RandomNumberGenerator 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(); } } }
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.remove(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(); // 产生数值 }
•
输入事件给出要发送给模型的消息。一旦模 型改变了它的状态,就立即通过关联机制通 知视图,让视图刷新显示。这个关联机制定 义了在模型与各个视图之间的关系,它允许 模型的运行独立于与它相关联的视图。类似 地,控制器在输入事件发生时将对视图及模 型进行控制与调度。
•
对于MVC,可通过开发模型的一个派生类, 履行与应用相关联的处理。如用户界面通过 定义视图和控制器的派生类来建立,这些派 生类中许多是可复用的类,像按钮和对话框 等,这样可以直接建立新的子系统。 • 设计过程的主要活动 1) 系统构造:将系统分解为一系列基本的 子系统,每一子系统是独立的软件成分。 2) 控制建模:建立系统各部分之间的控制 关系的一般模型。 3) 模块分解:将子系统进一步分解为模块。
使用java.util.Observer和java.util.Observable
使用java.util.Observer
ConcreteSubjectg.java
import java.util.*; public class ConcreteSubject extends Observable{ private 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; } public 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)); }}