软件开发基础_设计模式

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

设计模式(Designpattern)•设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。1设计模式(Designpattern)•GoF(“四人帮”GangofFour,指ErichGamma,RichardHelm,RalphJohnson&JohnVlissides四人)的《设计模式》(1995年出版)是第一次将设计模式提升到理论高度,并将之规范化。提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现。2•创建型模式...•1.AbstractFactory..2提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。•2.Builder2将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。•3.FactoryMethod..3定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。•4.Prototype..3用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。•5.Singleton.3保证一个类仅有一个实例,并提供一个访问它的全局访问点•结构型模式...•1.Adapter.4将一个类的接口转换成客户希望的另外一个接口。•2.Bridge..4将抽象部分与它的实现部分分离,使它们都可以独立的变化。•3.Composite..5将对象组合成树形结构以表示“部分-整体”的层次结构。•4.Decorator.5动态地给一个对象添加一些额外的职责。•5.Fa?ade..6为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。•6.Flyweight.6运用共享技术有效地支持大量细粒度的对象。•7.Proxy..7为其它对象提供一种代理以控制对这个对象的访问。3•行为模式...•1.ChainofResponsibility.7使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。•2.Command.7将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。•3.Interpreter.8给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语句中的句子。•4.Iterator8提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示。•5.Mediator8用一个中介对象来封装一系列的对象交互。•6.Memento..9在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。•7.Observer9定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。•8.State..9允许一个对象在其内部状态改变时改变它的行为。•9.Strategy.10定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。•10.TemplateMethod..10定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。•11.Visitor.10表示一个作用于某对象结构中的各元素的操作。•本文来自CSDN博客:•概述•在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。•意图•定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。[GOF《设计模式》]5•观察者模式•观察者模式(有时又被称为发布/订阅模式)是软体设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来事件处理系统。Java和c#的事件处理机制就是采用此种设计模式。6•观察者模式观察者模式7气象监控应用系统概观系统有三个部分:气象站—获取实际气象数据的物理设备气象数据对象—跟踪气象站的数据,并更新布告板布告板—向用户显示当前的目前状况(温度、湿度、气压)或气象统计或天气预报湿度感应装置温度感应装置气压感应装置气象站显示装置取得数据显示WeatherData对象“目前状况”是三种显示之一,用户也可以获得气象统计和天气预报。我们的实现气象站提供8Weather对象知道如何跟物理气象站联系,取得新的数据。我们的工作是建立一个应用,利用Weather对象的数据,更新三个布告板。第一号布告板第二号布告板第三号布告板将来的布告板9有三个布告板,将来可能需要增加新的布告板。WeatherDatagetTemperature()getHumidity()getPressure()measure-mentsChanged()//其它方法//一旦气象测量更新,此方法会被调用publicvoidmeasurementsChanged(){//你的代码加在这里}这三个方法返回各自最近的气象测量数据(温度、湿度和气压)。三个显示布告板中的一个。显示装置10气象站送来的数据类(WeatherData)我们的工作是实现measurementsChanged(),好让它更新目前状况、气象统计和天气预报的显示布告板。不在乎此方法是如何调用的,只在乎它被调用了。11不用设计模式,仍然能够实现publicclassWeatherData{//实例变量声明publicvoidmeasurementsChanged(){floattemp=getTemperature();floathumidity=getHumidity();floatpressure=getPressure();currentConditionsDisplay.update(temp,humidity,pressure);statisticsDisplay.update(temp,humidity,pressure);forecastDisplay.update(temp,humidity,pressure);}//其它WeatherData方法}取得最近的测量值。更新布告板。传入最新的测量值,调用布告板的更新显示。12我们的实现的缺陷在哪里?针对具体的实现编码。如果不修改程序,我们就无法增加或删除其它显示成分。(1)如果是为数不多的布告板还可以,如果有几十个布告板,这样写就很繁琐,采用观察者模式,发布者只需通过一个notifyObservers()就可以完成多个布告板的更新(2)采用设计模式,如果增加一个布告板,布告板只需要向发布者注册一下,发布者的代码不需要更改。符合oo设计原则:找到系统中变化的部分,将变化的部分同其它稳定的部分隔开。不采用设计模式,就没有注册和订阅,当增加一个布告板时,需要更改发布者内部的实现代码。(3)如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用这种设计模式,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。…currentConditionsDisplay.update(temp,humidity,pressure);statisticsDisplay.update(temp,humidity,pressure);forecastDisplay.update(temp,humidity,pressure);…针对具体实现编程,导致增加或删除布告板时,必须修改程序。主题对象管理某些数据。主题内的数据改变,就会通知观察者。观察者已经注册主题,以便在主题数据改变时能够收到更新。一旦数据改变,新的数据会以某种形式送到观察者手上。主题对象这个对象不是观察者,主题数据改变时不会被通知。鸭子对象狗对象猫对象老鼠对象观察者对象13会会观察者模式猫对象狗对象老鼠对象许多观察者要注册鸭子对象鸭子对象过来告诉主题,它想当一个观察者。主题对象14狗对象猫对象老鼠对象鸭子对象许多观察者主题对象鸭子对象已经是一个正式的观察者了。15狗对象猫对象鸭子对象老鼠对象许多观察者主题对象主题有了新的数据值!鸭子和其它所有观察者收到通知:主题已经改变了。16狗对象猫对象鸭子对象老鼠对象许多观察者主题对象取消注册老鼠要求从观察者中把自己除名。17狗对象鸭子对象猫对象许多观察者主题对象老鼠对象老鼠离开了!18许多观察者狗对象鸭子对象猫对象主题对象老鼠对象主题有一个新整数。除老鼠外的其它观察者都会收到通知!1920观察者模式也称为发布-订阅模式①报社的业务就是出版报纸②向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的用户,你就会一直收到新报纸③当你不想再看报纸的时候,取消订阅,他们就不会再送新报纸④只要报社还在运营,就会一直有人(或单位)向他们订阅报纸或取消订阅报纸狗对象鸭子对象猫对象老鼠对象许多观察者自动更新/通知主题对象一对多关系有状态的对象依赖者对象观察者模式在对象之间定义了一个一对多的依赖,如果一个对象改变了状态,就通知依赖于它的其它对象,并自动地更新这些对象。21观察者模式定义interfaceSubjectinterfaceObserverConcreteSubjectConcreteObserverregisterObserver()removeObserver()notifyObservers()update()registerObserver(){...}removeObserver(){...}notifyObservers(){...}getState()setState()update()//其它观察者的具体方法主题接口。对象使用此接口注册为观察者,或者把自己从观察者中删除。每个主题可以有多个观察者。所有潜在主题必须实现观察者接口。这个接口只有一个update()方法,当主题状态改变时它被调用。一个具体主题总是实现主题接口。除了注册和撤消方法外,具体主题还实现了notifyObservers()方法,此方法用于在状态改变时更新所有当前观察者。具体主题也可能有设置和获取状态的方法。具体观察者可以是实现此接口的任意类,观察者必须注册具体主题,以便接收更新。主题许多观察者22观察者模式类图实现观察者模式的一种方法。interfaceSbjectregisterObserver()removeObserver()notifyObservers()WeatherDataregisterObserver()removeObserver()notifyObservers()getTemperature()getHumidity()getPressure()measurementsChanged()interfaceObserverinterfaceDisplayElementdisplay()CurrentConditionsDisplayThirdPartyDisplayupdate()display(){//显示当前观测值}StatisticsDisplayupdate()display(){//显示最小、平均和最大观测值}update()display(){//显示基于观测值的其它内容}update()display(){//显示天气预报}ForecastDisplayupdate()此布告板根

1 / 37
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功