设计模式与用户界面设计.ppt

上传人:zhu****ei 文档编号:3602416 上传时间:2019-12-19 格式:PPT 页数:139 大小:2.28MB
返回 下载 相关 举报
设计模式与用户界面设计.ppt_第1页
第1页 / 共139页
设计模式与用户界面设计.ppt_第2页
第2页 / 共139页
设计模式与用户界面设计.ppt_第3页
第3页 / 共139页
点击查看更多>>
资源描述
软件工程导论,刘春计算机与信息工程学院软件工程系,两种软件开发方法,结构化方法,面向对象方法,3,回顾,面向对象设计方法概述系统设计软件体系结构设计硬件体系结构设计详细设计对象设计对象持久化设计面向对象的设计原则设计模式,将信息系统中比较关心的对象分层,可分为三层:用户界面层、业务层、数据访问层,再把各层中的一些公共部分提出来:权限管理、异常处理,这样得到包图如下:,软件体系结构的设计:以信息系统为例,用户界面层的职责是:与用户的交互,接收用户的各种输入以及输出各种提示信息或处理结果。对于输入的数据进行数据校验,过滤非法数据。向业务处理对象发送处理请求。,1、用户界面层,2、业务处理包,业务处理层的职责是:实现各种业务处理逻辑或处理算法。验证请求者的权限。向数据访问对象发送数据持久化操作的请求。向用户界面层返回处理结果。,3、数据访问包,数据访问层的职责是:实现数据的持久化操作实现事务处理,权限管理的主要职责是:验证请求者的请求权限提供请求者的权限列表,注:业务处理对象通过权限管理对象来验证权限,4、权限管理包,5、异常处理包,异常处理的职责:汇报运行时的详细异常信息记录异常处理日志,6、信息系统的体系结构的类图,硬件系统体系结构模型显示硬件的结构,包括不同的节点和这些节点之间如何连接,硬件体系结构设计,12,内容提纲,面向对象设计方法概述系统设计软件体系结构设计硬件体系结构设计详细设计对象设计对象持久化设计面向对象的设计原则设计模式,主要包括对象设计和对象持久化设计(数据库设计)对象设计:对象接口设计:确定对象的主要职责(对象倒底应该做什么)属性和操作的设计:设计属性的数据结构、类型,以及操作的算法、参数类型、返回值等对象持久化设计:数据对象的存储和检索,详细设计,永久类的存储设计永久类一般都是实体类,对应的是系统中涉及的数据每一个永久类映射为一个关系表,表格的列或字段对应类的属性,而行或记录对应类的实例(对象)关联的存储设计1:1关联:在一个类对应的表中用外键隐含管理1:n关联:在n端类对应的表中用外键隐含关联n:n关联:转换成1:n管理,然后按照上面的方法进行转换,基于关系数据库的对象持久化设计,1:1关联,1:n关联,17,内容提纲,面向对象设计方法概述系统设计软件体系结构设计硬件体系结构设计详细设计对象设计对象持久化设计面向对象的设计原则设计模式,单一职责原则开放-封闭原则接口隔离原则Liskov替换原则依赖倒置原则,面向对象设计原则,一个类只完成某一类功能(职责)尽可能避免出现一个“复合”功能的类在同一个类中完成多个不同的功能,1、单一职责原则,开放封闭原则:软件实体类(类、模块、函数等)应该是可以扩展、但是不可修改的基本思想:不用修改原有类就能扩展一个类的行为,2、开放封闭原则,什么是不封闭、不开放,如下的模型可以处理月薪制和时薪制职工工资,如果还要增加一种职工类型,其计酬方式不同(如提成制),则必定要修改Employee类,如何改进,利用抽象机制封闭:Employee及其子类是封闭的开放:可以派生新的子类,实现新的需求,Liskov替换原则:子类应当可以替换父类并出现在父类能够出现的任何地方核心思想:子类型必须能够替换它们的基类型,该原则能够知道设计人员正确地进行类的继承与派生,3、Liskov替换原则,一个违反Liskov原则的例子,正方形是长方形的一种特例,正方形有独特的行为方式通过覆盖父类的有关方法来实现子类行为,实际中的使用情况,长方形的使用者按照长方形的特点来调用SetWidth和SetHeight两个函数,并测试面积,代码如下:voidtestArea(Rectangle如果传递进来的是Square对象又会如何呢?显然会出现断言错误,测试失败。对于客户程序来说,模型中的层次结构是脆弱的,因为违反了LSP替换原则,Square对象和Rectangle对象的行为方式不相容,4、接口隔离原则,接口隔离原则:采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口更好。对接口的污染设计人员为了节省接口数目,而经常将一些功能相近或功能相关的接口合并成一个总的接口臃肿的大接口,面向过程自顶向下,逐步求精,形成上对下依赖依赖倒置原则:应用系统中的高层模块不应依赖于底层模块;抽象不应该依赖于细节实现,实现细节应该依赖于抽象。优点:复用、灵活性、易维护,5、依赖倒置原则,32,内容提纲,面向对象设计方法概述系统设计软件体系结构设计硬件体系结构设计详细设计对象设计对象持久化设计面向对象的设计原则设计模式,33,第十一章设计模式与用户界面设计,34,内容提纲,设计模式概述经典设计模式介绍用户界面设计,什么是设计模式?,设计模式:描述一个在我们周围不断重复发生的问题,以及该问题的解决方案。,使用设计模式,我们就能一次一次地利用已有方案而不必做重复劳动。,设计模式的起源,软件设计模式起源于建筑学1977年,建筑大师Alexander出版了APatternLanguage:Towns,Building,Construction一书受Alexander的影响,KentBeck和WardCunningham在1987年举行的一次面向对象的会议上发表了论文:在面向对象编程中使用模式,设计模式的四个基本要素,模式名称一个助记名,用几个词来描述模式的问题、解决方案和效果。问题描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果。有时候,问题部分会包括使用模式必须满足的一系列先决条件。解决方案描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。效果描述了模式应用的效果及使用模式应权衡的问题。比如模式的使用对系统的灵活性、扩充性或可移植性的影响。,为什么学习设计模式?,学习设计模式不仅可以使我们使用好这些成功的模式,利用已有的设计经验更重要的是可以使我们更加深刻地理解面向对象的设计思想,非常有利于我们更好地使用面向对象语言解决设计中的问题。,设计模式之四人帮(GOF),GOF:GangofFourErichGamma、RichardHelm、RalphJohnson、JohnVlissides),GOF之书,GOF之书:DesignPatterns:ElementsofReusableObject-OrientedSoftware(设计模式:可复用的面向对象软件的基本原理)。该书被广大喜爱者昵称为GOF之书,被认为是学习设计模式的必读著作,GOF之书已经被公认为是设计模式领域的奠基之作。,GOF之23种设计模式,创建型模式1.抽象工厂模式2.工厂方法模式3.单例模式4.建造者模式5.原型模式结构型模式1.适配器模式2.外观模式3.桥接模式4.组合模式5.装饰模式6.享元模式7.代理模式,行为型模式1.迭代器模式2.观察者模式3.策略模式4.职责链模式5.命令模式6.解释器模式7.中介者模式8.备忘录模式9.状态模式10.模板方法模式11.访问者模式,创建型模式关注的是如何创建对象而不是直接实例化对象,这会使程序在判断给定情况下创建哪一个对象时更为灵活五种创建型模式1.抽象工厂模式2.工厂方法模式3.单例模式4.建造者模式5.原型模式,创建型模式,结构型模式关注的是如何将一组对象组合成更大的结构七种创建型模式1.适配器模式2.外观模式3.桥接模式4.组合模式5.装饰模式6.享元模式7.代理模式,结构型模式,行为型模式关注的是如何定义系统内对像间的通信,以及复杂程序中的流程控制十一种创建型模式1.迭代器模式2.观察者模式3.策略模式4.职责链模式5.命令模式6.解释器模式,行为型模式,7.中介者模式8.备忘录模式9.状态模式10.模板方法模式11.访问者模式,45,内容提纲,设计模式概述经典设计模式介绍用户界面设计,经典设计模式介绍,创建型模式1.抽象工厂模式2.工厂方法模式3.单例模式4.建造者模式5.原型模式结构型模式1.适配器模式2.外观模式3.桥接模式4.组合模式5.装饰模式6.享元模式7.代理模式,行为型模式1.迭代器模式2.观察者模式3.策略模式4.命令模式5.职责链模式6.解释器模式7.中介者模式8.备忘录模式9.状态模式10.模板方法模式11.访问者模式,参考:清华大学耿祥义JAVA设计模式的课件,经典设计模式:抽象工厂模式,抽象工厂模式:提供一个创建一系列(相互依赖)对象的接口,而无需指定它们具体的类。应用背景:当系统准备为用户提供一系列相关的对象,又不想让用户代码和创建这些对象的类形成耦合时,就可以使用抽象工厂方法模式来设计系统。抽象工厂模式的关键:是在一个抽象类或接口中定义若干个抽象方法,这些抽象方法分别返回某个类的实例,该抽象类或接口让其子类或实现该接口的类重写这些抽象方法,为用户提供一系列相关的对象。,抽象工厂模式的结构,模式的结构中包括四种角色:抽象产品(Prodcut)具体产品(ConcreteProduct)抽象工厂(AbstractFactory)具体工厂(ConcreteFactory),抽象工厂模式的UML图,抽象工厂模式的应用实例,建立一个系统,该系统可以为用户提供西服套装(上衣裤子)和牛仔套装(上衣裤子)。,模式结构中每个部分的描述与使用(1/3),1抽象产品(Product):UpperClothes.javapublicabstractclassUpperClothespublicabstractintgetChestSize();publicabstractintgetHeight();publicabstractStringgetName();Trousers.javapublicabstractclassTrouserspublicabstractintgetWaistSize();publicabstractintgetHeight();publicabstractStringgetName();,模式结构中每个部分的描述与使用(1/3),2具体产品(ConcreteProduct)_1:WesternUpperClothes.javapublicclassWesternUpperClothesextendsUpperClothesprivateintchestSize;privateintheight;privateStringname;WesternUpperClothes(Stringname,intchestSize,intheight)this.name=name;this.chestSize=chestSize;this.height=height;publicintgetChestSize()returnchestSize;publicintgetHeight()returnheight;publicStringgetName()returnname;,模式结构中每个部分的描述与使用(1/3),2具体产品(ConcreteProduct)_2:CowboyUpperClothes.javapublicclassCowboyUpperClothesextendsUpperClothesprivateintchestSize;privateintheight;privateStringname;CowboyUpperClothes(Stringname,intchestSize,intheight)this.name=name;this.chestSize=chestSize;this.height=height;publicintgetChestSize()returnchestSize;publicintgetHeight()returnheight;publicStringgetName()returnname;,模式结构中每个部分的描述与使用(1/3),2具体产品(ConcreteProduct)_3:WesternTrousers.javapublicclassWesternTrousersextendsTrousersprivateintwaistSize;privateintheight;privateStringname;WesternTrousers(Stringname,intwaistSize,intheight)this.name=name;this.waistSize=waistSize;this.height=height;publicintgetWaistSize()returnwaistSize;publicintgetHeight()returnheight;publicStringgetName()returnname;,模式结构中每个部分的描述与使用(1/3),2具体产品(ConcreteProduct)_4:CowboyTrousers.javapublicclassCowboyTrousersextendsTrousersprivateintwaistSize;privateintheight;privateStringname;CowboyTrousers(Stringname,intwaistSize,intheight)this.name=name;this.waistSize=waistSize;this.height=height;publicintgetWaistSize()returnwaistSize;publicintgetHeight()returnheight;publicStringgetName()returnname;,模式结构中每个部分的描述与使用(1/3),3抽象工厂(AbstractFactory):ClothesFactory.javapublicabstractclassClothesFactorypublicabstractUpperClothescreateUpperClothes(intchestSize,intheight);publicabstractTrouserscreateTrousers(intwaistSize,intheight);,模式结构中每个部分的描述与使用(1/3),4具体工厂(ConcreteFactory):BeijingClothesFactory.javapublicclassBeijingClothesFactoryextendsClothesFactorypublicUpperClothescreateUpperClothes(intchestSize,intheight)returnnewWesternUpperClothes(北京牌西服上衣,chestSize,height);publicTrouserscreateTrousers(intwaistSize,intheight)returnnewWesternTrousers(北京牌西服裤子,waistSize,height);ShanghaiClothesFactory.javapublicclassShanghaiClothesFactoryextendsClothesFactorypublicUpperClothescreateUpperClothes(intchestSize,intheight)returnnewWesternUpperClothes(上海牌牛仔上衣,chestSize,height);publicTrouserscreateTrousers(intwaistSize,intheight)returnnewWesternTrousers(上海牌牛仔裤,waistSize,height);,模式结构中每个部分的描述与使用(1/3),5应用_1:Shop.javapublicclassShopUpperClothescloth;Trouserstrouser;publicvoidgiveSuit(ClothesFactoryfactory,intchestSize,intwaistSize,intheight)cloth=factory.createUpperClothes(chestSize,height);trouser=factory.createTrousers(waistSize,height);showMess();privatevoidshowMess()System.out.println();System.out.println(cloth.getName()+:);System.out.print(胸围:+cloth.getChestSize();System.out.println(身高:+cloth.getHeight();System.out.println(trouser.getName()+:);System.out.print(腰围:+trouser.getWaistSize();System.out.println(身高:+trouser.getHeight();,模式结构中每个部分的描述与使用(1/3),5应用_2:Application.javapublicclassApplicationpublicstaticvoidmain(Stringargs)Shopshop=newShop();ClothesFactoryfactory=newBeijingClothesFactory();shop.giveSuit(factory,110,82,170);factory=newShanghaiClothesFactory();shop.giveSuit(factory,120,88,180);,抽象工厂的优点,抽象工厂模式可以为用户创建一系列相关的对象,使得用户和创建这些对象的类脱耦。在抽象工厂模式中,可以随时增加“具体工厂”为用户提供一组相关的对象。,经典设计模式介绍,创建型模式1.抽象工厂模式2.工厂方法模式3.单例模式4.建造者模式5.原型模式结构型模式1.适配器模式2.外观模式3.桥接模式4.组合模式5.装饰模式6.享元模式7.代理模式,行为型模式1.迭代器模式2.观察者模式3.策略模式4.命令模式5.职责链模式6.解释器模式7.中介者模式8.备忘录模式9.状态模式10.模板方法模式11.访问者模式,经典设计模式:工厂方法模式,工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类应用背景:当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统抽象工厂模式的关键:是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例,工厂方法模式的结构,模式的结构中包括四种角色:抽象产品(Prodcut)具体产品(ConcreteProduct)构造者(Creator)具体构造者(ConcreteCreator),工厂方法模式的UML图,工厂方法模式的应用实例,假设有三个笔芯,分别是红笔芯、蓝笔芯和黑笔芯。用户希望通过圆珠笔来明确笔芯的颜色。,模式结构中每个部分的描述与使用(1/3),1抽象产品(Product):PenCore.javapublicabstractclassPenCoreStringcolor;publicabstractvoidwriteWord(Strings);,模式结构中每个部分的描述与使用(2/3),2具体产品(ConcreteProduct)_1:RedPenCore.javapublicclassRedPenCoreextendsPenCoreRedPenCore()color=红色;publicvoidwriteWord(Strings)System.out.println(写出+color+的字:+s);,模式结构中每个部分的描述与使用(3/3),2具体产品(ConcreteProduct)_2:BluePenCore.javapublicclassBluePenCoreextendsPenCoreBluePenCore()color=蓝色;publicvoidwriteWord(Strings)System.out.println(写出+color+的字:+s);,模式结构中每个部分的描述与使用(4/3),2具体产品(ConcreteProduct)_3:BlackPenCore.javapublicclassBlackPenCoreextendsPenCoreBlackPenCore()color=黑色;publicvoidwriteWord(Strings)System.out.println(写出+color+的字:+s);,模式结构中每个部分的描述与使用(5/3),3构造者(Creator):BallPen.javapublicabstractclassBallPenBallPen()System.out.println(生产了一只装有+getPenCore().color+笔芯的圆珠笔);publicabstractPenCoregetPenCore();/工厂方法,模式结构中每个部分的描述与使用(6/3),4具体构造者(ConcreteCreator):RedBallPen.javapublicclassRedBallPenextendsBallPenpublicPenCoregetPenCore()returnnewRedPenCore();BlueBallPen.javapublicclassBlueBallPenextendsBallPenpublicPenCoregetPenCore()returnnewBluePenCore();BlackBallPen.javapublicclassBlackBallPenextendsBallPenpublicPenCoregetPenCore()returnnewBlackPenCore();,模式结构中每个部分的描述与使用(7/3),5应用Application.javapublicclassApplicationpublicstaticvoidmain(Stringargs)PenCorepenCore;BallPenballPen=newBlueBallPen();penCore=ballPen.getPenCore();penCore.writeWord(你好,很高兴认识你);ballPen=newRedBallPen();penCore=ballPen.getPenCore();penCore.writeWord(Howareyou);ballPen=newBlackBallPen();penCore=ballPen.getPenCore();penCore.writeWord(nicetomeetyou);,工厂方法的优点,使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可,经典设计模式介绍,创建型模式1.抽象工厂模式2.工厂方法模式3.单例模式4.建造者模式5.原型模式结构型模式1.适配器模式2.外观模式3.桥接模式4.组合模式5.装饰模式6.享元模式7.代理模式,行为型模式1.迭代器模式2.观察者模式3.策略模式4.命令模式5.职责链模式6.解释器模式7.中介者模式8.备忘录模式9.状态模式10.模板方法模式11.访问者模式,经典设计模式:单例模式,单例模式:保证一个类仅有一个实例(对象),并提供一个访问它的全局访问点应用背景:怎样设计一个类,并使得该类只有一个实例(也即对象)单例模式的关键:是将类的构造方法设置为private,并提供一个返回它的唯一实例的类方法。,单例模式的结构,模式的结构中包括一种角色:单例类(Singleton),单例模式的应用实例(1/2),1单例类(Singleton):Moon.javapublicclassMoonprivatestaticMoonuniqueMoon;doubleradius;doubledistanceToEarth;privateMoon()uniqueMoon=this;radius=1738;distanceToEarth=363300;publicstaticMoongetMoon()if(uniqueMoon=null)uniqueMoon=newMoon();returnuniqueMoon;publicStringshow()Strings=月亮的半径是+radius+km,距地球是+distanceToEarth+km;returns;,单例模式的应用实例(1/2),2应用Application.javaimportjavax.swing.*;importjava.awt.*;publicclassApplicationpublicstaticvoidmain(Stringargs)MyFramef1=newMyFrame(张三看月亮);MyFramef2=newMyFrame(李四看月亮);f1.setBounds(10,10,360,150);f2.setBounds(370,10,360,150);f1.validate();f2.validate();classMyFrameextendsJFrameStringstr;MyFrame(Stringtitle)setTitle(title);Moonmoon=Moon.getMoon();str=moon.show();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);setVisible(true);repaint();publicvoidpaint(Graphicsg)super.paint(g);g.setFont(newFont(宋体,Font.BOLD,14);g.drawString(str,5,100);,单例模式的优点,单例类的唯一实例由单例类本身来控制,所以可以很好地控制用户何时访问它,经典设计模式介绍,创建型模式1.抽象工厂模式2.工厂方法模式3.单例模式4.建造者模式5.原型模式结构型模式1.适配器模式2.外观模式3.桥接模式4.组合模式5.装饰模式6.享元模式7.代理模式,行为型模式1.迭代器模式2.观察者模式3.策略模式4.命令模式5.职责链模式6.解释器模式7.中介者模式8.备忘录模式9.状态模式10.模板方法模式11.访问者模式,经典设计模式:适配器模式,适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。应用背景:如何在不修改代码的情况下,将一个接口修改为另外一个接口适配器模式的关键:是建立一个适配器,这个适配器实现了目标接口并包含有被适配者的引用。,适配器模式的结构,模式的结构中包括三种角色:目标(Target)被适配者(Adaptee)适配器(Adapter),适配器模式的UML图,适配器模式的优点,目标(Target)和被适配者(Adaptee)是完全解耦的关系。适配器模式满足“开-闭原则”。当添加一个实现Adaptee接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。,经典设计模式介绍,创建型模式1.抽象工厂模式2.工厂方法模式3.单例模式4.建造者模式5.原型模式结构型模式1.适配器模式2.外观模式3.桥接模式4.组合模式5.装饰模式6.享元模式7.代理模式,行为型模式1.迭代器模式2.观察者模式3.策略模式4.命令模式5.职责链模式6.解释器模式7.中介者模式8.备忘录模式9.状态模式10.模板方法模式11.访问者模式,经典设计模式:外观模式,外观模式:为系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。应用背景:简化用户和子系统(包含多个类)的交互外观模式的关键:是为各个子系统提供一个称作外观的类,该外观类的实例负责和各个子系统中类的实例打交道,外观模式的结构,模式的结构中包括两种角色:子系统(Subsystem)外观(Facade),外观模式的UML图,外观模式的应用实例(1/5),报社的广告系统有三个类CheckWord、Charge和TypeSetting类,各个类的职责如下:CheckWord类负责检查广告内容含有的字符数量;Charge类的实例负责计算费用;TypeSetting的实例负责对广告进行排版,外观模式的应用实例(2/5),1子系统(Subsystem)_1:CheckWord.javapublicclassCheckWordpublicfinalintbasicAmount=85;Stringadvertisement;intamount;publicCheckWord(Stringadvertisement)this.advertisement=advertisement;publicvoidsetChargeAmount()amount=advertisement.length()+basicAmount;/计算出计费字符数目publicintgetAmount()returnamount;,外观模式的应用实例(3/5),1子系统(Subsystem)_2:Charge.javapublicclassChargepublicfinalintbasicCharge=12;CheckWordcheckWord;Charge(CheckWordcheckWord)this.checkWord=checkWord;publicvoidgiveCharge()intcharge=checkWord.getAmount()*basicCharge;System.out.println(广告费用:+charge+元);,外观模式的应用实例(4/5),1子系统(Subsystem)_3:TypeSeting.javapublicclassTypeSetingStringadvertisement;publicTypeSeting(Stringadvertisement)this.advertisement=advertisement;publicvoidtypeSeting()System.out.println(广告排版格式:);System.out.println(*);System.out.println(advertisement);System.out.println(*);,外观模式的应用实例(5/5),2外观(Facade):ClientServerFacade.javapublicclassClientServerFacadeprivateCheckWordcheckWord;privateChargecharge;privateTypeSetingtypeSeting;Stringadvertisement;publicClientServerFacade(Stringadvertisement)this.advertisement=advertisement;checkWord=newCheckWord(advertisement);charge=newCharge(checkWord);typeSeting=newTypeSeting(advertisement);publicvoiddoAdvertisement()checkWord.setChargeAmount();charge.giveCharge();typeSeting.typeSeting();,外观模式的应用实例(6/5),3应用Application.javapublicclassApplicationpublicstaticvoidmain(Stringargs)ClientServerFacadeclientFacade;StringclientAdvertisement=鹿花牌洗衣机,价格2356元,联系电话:1234567;clientFacade=newClientServerFacade(clientAdvertisement);clientFacade.doAdvertisement();,外观模式的优点,使客户和子系统中的类无耦合。外观只是提供了一个更加简洁的界面,并不影响用户直接使用子系统中的类。子系统中任何类对其方法的内容进行修改,不影响外观的代码。,经典设计模式介绍,创建型模式1.抽象工厂模式2.工厂方法模式3.单例模式4.建造者模式5.原型模式结构型模式1.适配器模式2.外观模式3.桥接模式4.组合模式5.装饰模式6.享元模式7.代理模式,行为型模式1.迭代器模式2.观察者模式3.策略模式4.命令模式5.职责链模式6.解释器模式7.中介者模式8.备忘录模式9.状态模式10.模板方法模式11.访问者模式,经典设计模式:迭代器模式,迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示应用背景:如何高效的遍历一个集合中的每一个元素迭代器模式的关键:是将遍历集合的任务交给一个称作迭代器的对象,迭代器模式的结构,模式的结构中包括四种角色:集合(Aggregate)具体集合(ConcreteAggregate)迭代器(Iterator)具体迭代器(ConcreteIterator),迭代器模式的UML图,迭代器模式的应用实例(1/5),1集合(Aggregate):在这里我们使用java.util包中的Collection接口作为模式中的集合角色。Java所有的集合都实现了该接口。,2具体集合(ConcreteAggregate):在这里我们使用java.util包中的HashSet类的实例作为模式中的具体集合角色。,迭代器模式的应用实例(2/5),3迭代器(Iterator):在本问题中,我们使用的迭代器是java.util包中的Itertator接口。,4具体迭代器(ConcreteIterator)HashSet创建的集合可以使用iterator()方法返回一个实现Iterator接口类的实例,即一个具体迭代器。,迭代器模式的应用实例(3/5),5应用Application.java_1importjava.util.*;publicclassApplicationpublicstaticvoidmain(Stringargs)intn=20;intsum=0;Collectionset=newHashSet();for(inti=1;iiterator=set.iterator();intjia=1,zhen=1;System.out.println(保险箱共有+set.size()+张人民币);intk=0;while(iterator.hasNext()RenMinMonymoney=iterator.next();k+;if(money.getIsTrue()=false)System.out.println(第+k+张是假币,被销毁);iterator.remove();k+;System.out.println(保险箱现有真人民币+set.size()+张,总价值是:);iterator=set.iterator();while(iterator.hasNext()RenMinMonymoney=iterator.next();sum=sum+money.getValue();System.out.println(sum+元);,迭代器模式的应用实例(4/5),5应用Application.java_2classRenMinMonyintvalue;privatebooleanisTrue;RenMinMony(intvalue,booleanb)this.value=value;isTrue=b;publicbooleangetIsTrue()returnisTrue;publicintgetValue()returnvalue;,迭代器模式的优点,用户使用迭代器访问集合中的对象,而不需要知道这些对象在集合中是如何表示及存储的。用户可以同时使用多个迭代器遍历一个集合。,经典设计模式介绍,创建型模式1.抽象工厂模式2.工厂方法模式3.单例模式4.建造者模式5.原型模式结构型模式1.适配器模式2.外观模式3.桥接模式4.组合模式5.装饰模式6.享元模式7.代理模式,行为型模式1.迭代器模式2.观察者模式3.策略模式4.命令模式5.职责链模式6.解释器模式7.中介者模式8.备忘录模式9.状态模式10.模板方法模式11.访问者模式,经典设计模式:观察者模式,观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。应用背景:多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化,观察者模式的实例,某些寻找工作的人对“求职中心”的职业需求信息的变化非常关心,很想跟踪“求职中心”中职业需求信息的变化。“求职者”可以让“求职中心”把自己登记下来,这样求职中心就会及时通知她最新的职业信息需求。,观察者模式的结构,模式的结构中包括四种角色:主题(Subject)具体主题(ConcreteSubject)观察者(Observer)具体观察者(ConcreteObserver),观察者模式的UML图,观察者模式的应用实例(1/5),某些寻找工作的人对“求职中心”的职业需求信息的变化非常关心,很想跟踪“求职中心”中职业需求信息的变化。“求职者”可以让“求职中心”把自己登记下来,这样求职中心就会及时通知她最新的职业信息需求。,观察者模式的应用实例(2/5),1主题:Subject.javapublicinterfaceSubjectpublicvoidaddObserver(Observero);publicvoiddeleteObserver(Observero);publicvoidnotifyObservers();publicvoidgiveNewMess();,观察者模式的应用实例(3/5),2观察者:Obsever.javapublicinterfaceObserverpublicvoidhearTelephone(StringheardMess);,观察者模式的应用实例(3/5),3具体主题SeekJobCenter.java_1importjava.util.ArrayList;publicclassSeekJobCenterimplementsSubjectStringmess;booleanchanged;ArrayListpersonList;SeekJobCenter()personList=newArrayList();mess=;changed=false;publicvoidaddObserver(Observero)if(!(personList.contains(o)personList.add(o);publicvoiddeleteObserver(Observero)if(personList.contains(o)personList.remove(o);,观察者模式的应用实例(4/5),3具体主题SeekJobCenter.java_2publicvoidnotifyObservers()if(changed)for(inti=0;ipersonList.size();i+)Observerobserver=personList.get(i);observer.hearTelephone(mess);changed=false;publicvoidgiveNewMess(Stringstr)if(str.equals(mess)changed=false;elsemess=str;changed=true;,观察者模式的应用实例(5/5),4具体观察者_1UniversityStudent.javaimportjava.io.*;publicclassUniverStudentimplementsObserverSubjectsubject;FilemyFile;UniverStudent(Subjectsubject,StringfileName)this.subject=subject;subject.addObserver(this);/使当前实例成为subject所引用的具体主题的观察者myFile=newFile(fileName);publicvoidhearTelephone(StringheardMess)tryRandomAccessFileout=newRandomAccessFile(myFile,rw);out.seek(out.length();byteb=heardMess.getBytes();out.write(b);/更新文件中的内容System.out.print(我是一个大学生,);System.out.println(我向文件+myFile.getName()+写入如下内容:);System.out.println(heardMess);catch(IOExceptionexp)System.out.println(exp.toString();,观察者模式的应用实例(6/5),4具体观察者_2HaiGui.javaimportjava.io.*;importjava.util.regex.*;publicclassHaiGuiimplementsObserverSubjectsubject;FilemyFile;HaiGui(Subjectsubject,StringfileName)this.subject=subject;subject.addObserver(this);/使当前实例成为subject所引用的具体主题的观察者myFile=newFile(fileName);publicvoidhearTelephone(StringheardMess)trybooleanboo=heardMess.contains(java程序员)|heardMess.contains(软件);if(boo)RandomAccessFileout=newRandomAccessFile(myFile,rw);out.seek(out.length();byteb=heardMess.getBytes();out.write(b);System.out.print(我是一个海归,);System.out.println(我向文件+myFile.getName()+写入如下内容:);System.out.println(heardMess);elseSystem.out.println(我是海归,这次的信息中没有我需要的信息);catch(IOExceptionexp)System.out.println(exp.toString();,观察者模式的应用实例(7/5),5应用Application.javapublicclassApplicationpublicstaticvoidmain(Stringargs)SeekJobCentercenter=newSeekJobCenter();UniverStudentzhangLin=newUniverStudent(center,A.txt);HaiGuiwangHao=newHaiGui(center,B.txt);center.giveNewMess(腾辉公司需要10个java程序员。);center.notifyObservers();center.giveNewMess(海景公司需要8个动画设计师。);center.notifyObservers();center.giveNewMess(仁海公司需要9个电工。);center.notifyObservers();center.giveNewMess(仁海公司需要9个电工。);center.notifyObservers();,观察者模式的优点,观察模式满足“开-闭原则”主题接口仅仅依赖于观察者接口,这样,我们就可以让创建具体主题的类也仅仅是依赖于观察者接口,因此如果增加新的实现观察者接口的类,不必修改创建具体主题的类的代码。同样,创建具体观察者的类仅仅依赖于主题接口,如果增加新的实现主题接口的类,也不必修改创建具体观察者类的代码。,经典设计模式介绍,创建型模式1.抽象工厂模式2.工厂方法模式3.单例模式4.建造者模式5.原型模式结构型模式1.适配器模式2.外观模式3.桥接模式4.组合模式5.装饰模式6.享元模式7.代理模式,行为型模式1.迭代器模式2.观察者模式3.策略模式4.命令模式5.职责链模式6.解释器模式7.中介者模式8.备忘录模式9.状态模式10.模板方法模式11.访问者模式,经典设计模式:策略模式,策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。在策略模式中,封装算法标识的接口称作策略,实现该接口的类称作具体策略,策略模式的结构,模式的结构中包括三种角色:策略(Strategy)具体策略(ConcreteStrategy)上下文(Context),策略模式的UML图,策略模式的应用实例(1/5),1策略(Strategy):Computable.javapublicinterfaceComputableStrategypublicabstractdoublecomputeScore(doublea);,策略模式的应用实例(2/5),2具体策略(ConcreteStrategy):StrategyOne.javapublicclassStrategyOneimplementsComputableStrategypublicdoublecomputeScore(doublea)doublescore=0,sum=0;for(inti=0;ia.length;i+)sum=sum+ai;score=sum/a.length;returnscore;,计算平均值的方式,策略模式的应用实例(3/5),2具体策略(ConcreteStrategy):StrategyTwo.javapublicclassStrategyTwoimpl
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!