软件设计模式与体系结构_第1页
软件设计模式与体系结构_第2页
软件设计模式与体系结构_第3页
软件设计模式与体系结构_第4页
软件设计模式与体系结构_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

-.z计算机科学与技术学院?软件设计模式与体系构造?课程作业〔一〕〔2021/2021学年第二学期〕学生**:雷君学生专业:软件工程学生班级:142601学生**:202126170108指导教师:王飞目录TOC\o"1-2"\h\z\u实验一1工厂方法模式——汽车保险1抽象工厂方法模式——房屋信息3实验二6组合模式——空军指挥系统6适配器模式——客户信息验证8实验三11桥接模式——几何立体体积11访问者模式——计算机部件销售软件14实验四17策略模式——整数排序17状态模式——交通信号灯19实验五21MVC软件体系构造21-.z实验一工厂方法模式——汽车保险【实验内容】在例2.3的汽车保险管理应用程序实例上添加一个名为Lu*uryCarInsurance的类,并且,该类要与其他的类一样能执行相应的功能。【添加代码】添加Lu*uryCarInsurance类:publicclassLu*uryCarInsuranceimplementsAutoInsurance{privateStringdescription;publicStringgetInsuranceDescription(){ description="Lu*uryCarInsurance:\n\nLu*uryCarInsurancecoveragepaysformedicalbills"+ "lostwages,rehabilitation,treatmentand/or"+ "funeralcostsforanyoneinjuredorkilled"+ "byyourcar.Suchcoveragewillalsopayfor"+ "painandsufferingdamageswhenathird"+ "partysuccessfullysues.";returndescription;}}添加Lu*uryCarPolicyProducer类:publicclassLu*uryCarPolicyProducerimplementsPolicyProducer{publicAutoInsurancegetPolicyObj()//Fruitfactory(){returnnewLu*uryCarInsurance();}}添加GUI:〔1〕publicstaticfinalStringLU*URYCAR="Lu*uryCarInsurance";〔2〕cmbInsuranceType.addItem(LU*URYCAR);〔3〕if(type.equals(LU*URYCAR)){ pp=newLu*uryCarPolicyProducer();}【实验结果】【实验小结】使用工厂方法访问并且初始化适宜的类的对象,简化了应用程序,应用程序本身不再含有大量的条件语句判定何时选取哪个类。其次,工厂方法实现了一些特殊的*个类的机制,尤其是层次构造不同的类需要不同的初始化方法的时候。抽象工厂方法模式——房屋信息【实验内容】在例2.4中设计并且实现了豪华〔Super〕和中等〔Medum〕别墅〔House〕和公寓〔Condo〕的查询。要求在该设计的根底上,增加一个新的类SemiDetacher〔半独立式楼宇〕,并且编写代码实现相应的查询功能。【添加代码】1、添加SemiDetacher类:publicinterfaceSemiDetacher{ publicStringgetSemiDetacherInfo(); publicStringgetSemiDetacherFeatures();}添加SuperSemiDetacher类:publicclassSuperSemiDetacherimplementsSemiDetacher{privateStringname;publicSuperSemiDetacher(Stringame) { name=ame; }publicStringgetSemiDetacherInfo() { return"superSemiDetacher.html";} publicStringgetSemiDetacherFeatures() { return"SuperSemiDetacher"; }}3、添加MediumSemiDetacher类:publicclassMediumSemiDetacherimplementsSemiDetacher{ privateStringname; publicMediumSemiDetacher(Stringame) {name=ame; } publicStringgetSemiDetacherInfo() { return"MediumSemiDetacher.html"; } publicStringgetSemiDetacherFeatures() { return"MediumSemiDetacher"; }}添加BuildingFactory:publicabstractSemiDetachergetSemiDetacher();5、添加MediumBuildingFactory:publicSemiDetachergetSemiDetacher(){ returnnewMediumSemiDetacher("MediumSemiDetacher");}添加SuperBuildingFactory:publicSemiDetachergetSemiDetacher(){ returnnewSuperSemiDetacher("SuperSemiDetacher");}7、添加GUI:〔1〕publicstaticfinalStringSEMIDETACHER="SemiDetacher";〔2〕cmbHouseType.addItem(SEMIDETACHER);〔3〕if(type.equals(AbstractFactoryGUI.SEMIDETACHER)){SemiDetachercd=bf.getSemiDetacher(); StringfileNm=cd.getSemiDetacherInfo(); putHouseInfoToScreen(fileNm);}【实验结果】【实验小结】当客户对象要从一个相关的产品组中创立一个对象,而没有必要知道到底要创立哪个对象时,可以使用抽象工厂模式。如果不使用抽象工厂模式,创立对象的条件语句将会出现在客户程序的许多地方,程序的克维护性差。抽象工厂模式帮助程序员防止了以上所述的重复的、复杂的条件语句,提供必要的创立对象的接口。实验二组合模式——空军指挥系统【实验内容】在例3.3的设计中,添加一个空军大队〔Wing〕类,该类与Squadron、Group类是平行的,因此应该继承了AirUnit类。该类的写法与Squadron或者Group类是类似的,所不同的是一个Wing有216中类型的飞机。【添加代码】添加Wing类:publicclassWinge*tendsAirUnit{publicstaticfinalStringFEATURES="AWingwith216aircrafts";Airforce[]fighters=newAirforce[162];Airforce[]bombers=newAirforce[18];Airforce[]transporters=newAirforce[18];Airforce[]eAircrafts=newAirforce[18];publicWing(){for(intk=0;k<162;k++){//need162fighters }for(intk=0;k<18;k++){//need18bombers }for(intk=0;k<18;k++){//need18transporters }for(intk=0;k<18;k++){//need18eAirplanes }}publicStringgetDescription(){ returnFEATURES;}publicStringfight(){ returnsuper.fight(); }}添加GUI:〔1〕privateString[]AirForceUnit={"SQUADRON","GROUP","WING"};〔2〕add(1,6,airCheckBo*[13]);〔3〕elseif((m==13)&&(ckBo*States[13]==SELECTED)){ unit=newWing(); airUnits.attach(unit); unitInfo=unit.getDescription(); }【实验结果】【实验小结】我们这样来简单的理解组合模式,组合模式就是把一些现有的对象或者元素,经过组合后组成新的对象,新的对象提供内部方法,可以让我们很方便的完成这些元素或者内部对象的访问和操作。我们也可以把组合对象理解成一个容器,容器提供各种访问其内部对象或者元素的API,我们只需要使用这些方法就可以操作它了。适配器模式——客户信息验证【实验内容】关于例3.7的用于验证客户信息的离架产品类CusInfoValidation的功能扩展问题。要求使用适配器模式。【添加代码】添加InformationAdapter:publicbooleanisValidEmailAddr(StringEmailAddr){ booleanisValid=true; inta=0; intb=0;Stringns=EmailAddr.trim(); StringnStr=ns.replaceAll("\\s{1,}","); intlen=nStr.length();if((((nStr.charAt(0)>='A')&&(nStr.charAt(0)>='Z'))|| ((nStr.charAt(0)>='a')&&(nStr.charAt(0)>='z')))&&(len>=5)){ for(intm=0;m<len;m++){if((Character.isLetter(nStr.charAt(m))==true)&&(Character.isDigit(nStr.charAt(m))==true)){ isValid=false; } if(nStr.charAt(m)==''){ a++; } if(nStr.charAt(m)>='0'&&nStr.charAt(m)<='9'){ b++; } if((m==0)&&(Character.isLetter(nStr.charAt(m))==false)){ isValid=false; } } if(a!=1){ isValid=false; } if(b==0){ isValid=false; } returnisValid; } else{ returnfalse; } }添加CusInfoValidator:publicabstractbooleanisValidEmailAddr(StringEmailAddr);3、添加GUI:〔1〕privateJTe*tFieldt*tCustomerName,t*tAddress,t*tZip,t*tCellPhone,t*tSSN,t*tEmailAddr;〔2〕privateJLabellblCustomerName,lblAddress,lblZip,lblCellphone,lblSSN,lblEmailAddr;〔3〕t*tEmailAddr=newJTe*tField(20);〔4〕lblEmailAddr=newJLabel("EmailAddr:");〔5〕UIPanel.add(lblEmailAddr); UIPanel.add(t*tEmailAddr);〔6〕gridbag.setConstraints(lblEmailAddr,gbc);gbc.grid*=1; gbc.gridy=5; gridbag.setConstraints(t*tEmailAddr,gbc); gbc.grid*=0; gbc.gridy=6;〔7〕publicStringgetEmailAddr(){ returnt*tEmailAddr.getTe*t(); }〔8〕Stringemailaddr=getEmailAddr();〔9〕if(cusInfo.isValidEmailAddr(emailaddr)==false){dataTe*tArea.append("\nWrongformatofEmailAddr.");}else{dataTe*tArea.append("\nCorrectformatofEmailAddr.");}【实验结果】【实验小结】通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑;复用了现存的类,解决了现存类和复用环境要求不一致的问题;将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码;一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。对于对象适配器来说,更换适配器的实现过程比较复杂。实验三桥接模式——几何立体体积【实验内容】在例3.14中的设计实验层次类局部中,添加Ellipsoid〔椭球〕类,并且实现针对椭球体积的计算。【添加代码】1、添加椭球类:publicclassEllipsoidimplementsGeoForm{ privatedoubleaRadius; privatedoublebRadius; privatedoublecRadius; publicEllipsoid(doubleaRadius,doublebRadius,doublecRadius){this.aRadius=aRadius; this.bRadius=bRadius; this.cRadius=cRadius; } publicdoubleputeVolume(){ doublevolume=1.3333333*3.1415926*aRadius*bRadius*cRadius; returnvolume; } }2、添加GUI:〔1〕privateJTe*tFieldt*tEllipsoidRadius_a;privateJTe*tFieldt*tEllipsoidRadius_b;privateJTe*tFieldt*tEllipsoidRadius_c;〔2〕publicstaticfinalStringELLIPSOID="Ellipsoid";〔3〕cmbGeoForm.addItem(ELLIPSOID);〔4〕elseif(selection.equals(ELLIPSOID)){Stringa_radius=t*tEllipsoidRadius_a.getTe*t(); Stringb_radius=t*tEllipsoidRadius_b.getTe*t(); Stringc_radius=t*tEllipsoidRadius_c.getTe*t(); doublea=Double.valueOf(a_radius); doubleb=Double.valueOf(b_radius);doublec=Double.valueOf(c_radius); form=newEllipsoid(a,b,c); }〔5〕elseif(selection.equals(ELLIPSOID)) displayNewGUI(getTypePanel(ELLIPSOID));〔6〕elseif(type.equals(ELLIPSOID)){ JLabellblRadius_a=newJLabel("InputRadiusa"); JLabellblRadius_b=newJLabel("InputRadiusb"); JLabellblRadius_c=newJLabel("InputRadiusc"); t*tEllipsoidRadius_a=newJTe*tField(8); t*tEllipsoidRadius_b=newJTe*tField(8); t*tEllipsoidRadius_c=newJTe*tField(8); GridBagLayoutgridbag=newGridBagLayout(); typePanel.setLayout(gridbag); GridBagConstraintsgbc=newGridBagConstraints(); typePanel.add(lblRadius_a); typePanel.add(lblRadius_b); typePanel.add(lblRadius_c);typePanel.add(t*tEllipsoidRadius_a); typePanel.add(t*tEllipsoidRadius_b); typePanel.add(t*tEllipsoidRadius_c); typePanel.add(lblMeasure);typePanel.add(cmbMeasure); gbc.insets.top=5; gbc.insets.bottom=5; gbc.insets.left=1; gbc.insets.right=8; gbc.anchor=GridBagConstraints.WEST; gbc.grid*=0; gbc.gridy=0;gridbag.setConstraints(lblRadius_a,gbc);gbc.grid*=1; gbc.gridy=0;gridbag.setConstraints(t*tEllipsoidRadius_a,gbc);gbc.grid*=0; gbc.gridy=1;gridbag.setConstraints(lblRadius_b,gbc);gbc.grid*=1; gbc.gridy=1;gridbag.setConstraints(t*tEllipsoidRadius_b,gbc);gbc.grid*=0; gbc.gridy=2; gridbag.setConstraints(lblRadius_c,gbc); gbc.grid*=1;gbc.gridy=2;gridbag.setConstraints(t*tEllipsoidRadius_c,gbc);gbc.grid*=0; gbc.gridy=3;gridbag.setConstraints(lblMeasure,gbc);gbc.grid*=1; gbc.gridy=3;gridbag.setConstraints(cmbMeasure,gbc); }【实验结果】【实验小结】通过这次实验我们大概理解了桥接模式,通过关联“抽象层次类〞与“具体层次类〞这一桥梁,将表示两个维度的层类〔数据构造〕粘贴在一起,形成更大的数据构造,而这种变化又不会对现有的类产生影响,这种思路的终极想法是将软件设计的抽象局部与实现局部别离,使它们都可以独立的变化。访问者模式——计算机部件销售软件【实验内容】在例4.5的设计中添加一个类SoundBo*。该类实现接口puterParts,并且其他的计算机部件的类的构造类似。【添加代码】1、添加SoundBo*类:publicclassSoundBo*implementsputerParts{publicstaticfinalStringNAME="SoundBo*"; privatefinaldoublePRICE=127.00; publicstaticfinalStringFEATURES="SoundBo*.*3K"; publicStringgetName(){ returnNAME; } publicdoublegetPrice(){returnPRICE;}publicStringgetDescription(){ returnFEATURES; } publicvoidaccept(Visitorv){System.out.println("SoundBo*hasbeenvisited.");v.visitSoundBo*(this);}}添加GUI:〔1〕String[]pParts={"Case","Motherboard","Microprocessor","Memory","DriveController","VideoCard","Fan","PowerSupply","HardDiskDrive","CDDrive","DVDDevice","Monitor","Keyboard","Mouse","SoundBo*","Assembly","WholePC"};〔2〕for(intk=11;k<17;k++)add(0,k,cParts[k]);〔3〕elseif(source==cParts[14]) states[14]=state; elseif(source==cParts[15]){ if(state==SELECTED){ cParts[1].setSelected(true);cParts[8].setSelected(true); } elseif(state==DESELECTED){ cParts[1].setSelected(false); cParts[8].setSelected(false); } states[15]=state; } elseif(source==cParts[16]){if(state==SELECTED){ cParts[0].setSelected(true); for(intk=11;k<15;k++) cParts[k].setSelected(true); } elseif(state==DESELECTED){ cParts[0].setSelected(false); for(intk=11;k<15;k++) cParts[k].setSelected(false); } states[16]=state; }〔4〕elseif((m==14)&&(states[14]==SELECTED)){ part=newSoundBo*(); msg.add("SoundBo*"); }3、添加Visitor:publicabstractvoidvisitSoundBo*(SoundBo*e);添加PriceVisitor:publicvoidvisitSoundBo*(SoundBo*e){ price=e.getPrice(); partsPrices.add(newDouble(price)); total+=price;}5、添加PartsInfoVisitor:publicvoidvisitSoundBo*(SoundBo*e){ partInfo=e.getDescription(); allOders=allOders+"\n"+partInfo; }【实验结果】【实验小结】通过此次实验让我们更加深刻的理解了访问者模式,它在处理数据构造较稳定,但是作用于其上的操作需要经常变化的问题时时非常有效的,因此可以在不改变该构造体中的类的根底上定义一个新的操作,这个实验就是如此,我们只需要添加新的类,然后调用accept(pv)方法就可以。实验四策略模式——整数排序【实验内容】在例4.13的设计中的排序策略局部,添加一个类BidirectionaBubbleSort,进展“双向冒泡法排序〞,以便扩展该排序系统的功能。为了实现扩展功能,需要相应地修改Conte*t类与客户图形界面类StrategyGUI。【添加代码】添加BidirBubbleSort类:publicclassBidirBubbleSortimplementsSortAlgorithm{publicint[]sort(int[]nums,Conte*tct){ct.startE*ecution();intj;intlimit=nums.length;intst=-1;while(st<limit){booleanflipped=false;st++;limit--;for(j=st;j<limit;j++){if(nums[j]>nums[j+1]){intT=nums[j];nums[j]=nums[j+1];nums[j+1]=T;flipped=true;}}if(!flipped){ct.endE*ecution();returnnums;}for(j=limit;--j>=st;){if(nums[j]>nums[j+1]){intT=nums[j];nums[j]=nums[j+1];nums[j+1]=T;flipped=true;}}if(!flipped){ ct.endE*ecution();returnnums;}}ct.endE*ecution();returnnums;}}添加GUI:〔1〕publicstaticfinalStringBidirBubble="BidirBubbleSort";〔2〕cmbAlgorithm.addItem(BidirBubble);〔3〕if(type.equals(BidirBubble)){ sa=newB

温馨提示

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

评论

0/150

提交评论