软件开发基础_设计模式.ppt_第1页
软件开发基础_设计模式.ppt_第2页
软件开发基础_设计模式.ppt_第3页
软件开发基础_设计模式.ppt_第4页
软件开发基础_设计模式.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、设计模式(Design pattern),设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。,1,设计模式(Design pattern),GoF(“四人帮”Gang of Four,指Erich Gamma, Richard Helm, Ralph Johnson float humidity = getHumidity(); float

2、 pressure = getPressure(); currentConditionsDisplay.update(temp, humidity, pressure); statisticsDisplay.update(temp, humidity, pressure); forecastDisplay.update(temp, humidity, pressure); / 其它WeatherData方法 ,取得最近的测量值。,更新布告板。,传入最新的测量值,调用布告板的更新显 示。,12,我们的实现的缺陷在哪里? 针对具体的实现编码。如果不修改程序,我们就无法增加或删除其它显示成分。 (1

3、)如果是为数不多的布告板还可以,如果有几十个布告板,这样写就很繁琐,采用观察者模式,发布者只需通过一个notifyObservers()就可以完成多个布告板的更新 (2)采用设计模式,如果增加一个布告板,布告板只需要向发布者注册一下,发布者的代码不需要更改。符合oo设计原则:找到系统中变化的部分,将变化的部分同其它稳定的部分隔开。不采用设计模式,就没有注册和订阅,当增加一个布告板时,需要更改发布者内部的实现代码。 (3)如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用这种设计模式,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。, currentCo

4、nditionsDisplay.update(temp, humidity, pressure); statisticsDisplay.update(temp, humidity, pressure); forecastDisplay.update(temp, humidity, pressure); ,针对具体实现编程,导致增加或删除布告板时,必须修改程序。,13,会会观察者模式,14,15,16,17,18,19,20,观察者模式也称为发布-订阅模式 报社的业务就是出版报纸 向某家报社订阅报纸,只要他们有新报纸出版,就会给 你送来。只要你是他们的用户,你就会一直收到新报纸 当你不想再看报纸

5、的时候,取消订阅,他们就不会再送 新报纸 只要报社还在运营,就会一直有人(或单位)向他们订 阅报纸或取消订阅报纸,21,观察者模式定义,22,观察者模式类图,实现观察者模式的一种方法。,23,设计气象站,右边三个布告板也应该有一个“主题”指针指向WeatherData对象,本图未画出来。,24,实现气象站, 主题接口,观察者接口 public interface Subject public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers

6、(); public interface Observer public void update(float temp, float humidity, float pressure); public interface DisplayElement public void display(); ,需要观察者作为参数。,25,实现气象数据的Subject接口的类 public class WeatherData implements Subject private ArrayList observers; private float temperature; private float hum

7、idity; private float pressure; public WeatherData() observers = new ArrayList(); ,ArrayList记录观察者。,26,public void registerObserver(Observer o) observers.add(o); public void removeObserver(Observer o) int i = observers.indexOf(o); if (i = 0) observers.remove(i); public void notifyObservers() for (int

8、i = 0; i observers.size(); i+) Observer observer = (Observer)observers.get(i); observer.update(temperature, humidity, pressure); ,27,public void setMeasurements(float temperature, float humidity, float pressure) this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; noti

9、fyObservers(); / other WeatherData methods here ,28,布告板1的实现显示 public class CurrentConditionsDisplay implements Observer, DisplayElement private float temperature; private float humidity; private Subject weatherData; public CurrentConditionsDisplay(Subject weatherData) this.weatherData = weatherData;

10、 weatherData.registerObserver(this ); /注册对象 public void update(float temperature, float humidity, float pressure) this.temperature = temperature; this.humidity = humidity; display(); public void display() System.out.println(Current conditions: + temperature + F degrees and + humidity + % humidity);

11、,weatherData供注册或取消注册之用。,另外两个布告板的实现非常类似。,29,为气象站提供动力 public class WeatherStation public static void main(String args) WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); StatisticsDisplay statisticsDisplay = new StatisticsD

12、isplay(weatherData); ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); weatherData.setMeasurements(80, 65, 30.4f); weatherData.setMeasurements(82, 70, 29.2f); weatherData.setMeasurements(78, 90, 29.2f); ,模拟新的气象测量。,30,运行程序,31,Java内置的观察者模式 java.util包(package)内包含了最基本的Observable类与 Obse

13、rver接口,这与我们subject接口和Observer接口很 相似。 Java GUI。例如,JButton可以增加或删除倾听者 (listener),例如,ActionListener能倾听在按钮上发生的 动作。这些倾听者就是观察者。 JavaBeans。,32,松耦合的威力 当两个对象是松耦合的,它们彼此之间能够交互,但是 相互了解很少。 观察者模式提供了主题和观察者之间的松耦合设计。 因为主题只知道观察者实现了某个接口(即Observer接口), 主题不需要知道具体观察者是谁、作了些什么或其它任何 细节。要增加新的观察者或删除观察者,主题不会受到任 何影响,不必修改主题代码。 可以独

14、立地复用主题和观察者,它们之间互不影响, 即是松耦合的。,33,松耦合的威力(续),由于松耦合设计使得对象间的依赖最小化,所以, 我们能够创建柔性的OO系统,应对变化的情况,因为 对象之间的依赖降到了最低。,涉及的设计原则 1、 Identify the aspects of your application that vary and separate them from what stays the same. (找到系统中变化的部分,将变化的部分同其它稳定的部分隔开。) 在观察者模式的应用场景里变化的部分是Subject的状态和Observer的数量。使用Observer模式可以很好地将

15、这两部分隔离开,我们可以任意改变Observer的数量而不需要去修改Subject,而Subject的状态也可以任意改变,同样不会对其Observer有任何影响。,34,2、 Program to an interface,not an implementation.(面向接口编程,而不要面向实现编程。) Subject和Observer都使用接口来实现。Subject只需要跟踪那些实现了IObserver接口的对象,所以其只依赖于IObserver;而所有Observer都通过ISubject接口来注册、撤销、接收通知,所以它们也只依赖于 ISubject;所以这是面向接口编程的,这样的实现方式使得Subject和Observer之间完全没有任何耦合。,35,3、 Favor composition over inheritance.(优先使用对象组合,而非类继承) 观察者模式使用对象组合将Subject和若干observer联系起来。它们之间的关系不是通过类的继承而是在运行时的动态组合。,36,参考资料: UML和模式应用

温馨提示

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

评论

0/150

提交评论