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

下载本文档

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

文档简介

1、.计算机科学与技术学院软件设计模式与体系结构课程作业(一)( 2016/2017 学年 第二学期)学生姓名:雷 君学生专业:软件工程学生班级:142601学生学号:201426170108指导教师 :王 飞.目 录实验一1工厂方法模式汽车保险1抽象工厂方法模式房屋信息3实验二6组合模式空军指挥系统6适配器模式客户信息验证8实验三11桥接模式几何立体体积11访问者模式计算机部件销售软件14实验四17策略模式整数排序17状态模式交通信号灯19实验五21MVC软件体系结构21.实验一工厂方法模式汽车保险【实验内容】在例 2.3 的汽车保险管理应用程序实例上添加一个名为LuxuryCarInsuran

2、ce的类,并且,该类要与其他的类一样能执行相应的功能。【添加代码】1、添加 LuxuryCarInsurance 类:public class LuxuryCarInsurance implements AutoInsuranceprivate String description;public String getInsuranceDescription()description = LuxuryCarInsurance: nnLuxuryCarInsurance coverage pays for medical bills + lost wages, rehabilitation, tr

3、eatment and/or + funeral costs for anyone injured or killed + by your car. Such coverage will also pay for + pain and suffering damages when a third + party successfully sues. ;return description;2、添加 LuxuryCarPolicyProducer 类:public class LuxuryCarPolicyProducer implements PolicyProducer public Aut

4、oInsurance getPolicyObj() /Fruit factory()return new LuxuryCarInsurance();3、添加 GUI:( 1) public static final String LUXURYCAR = LuxuryCar Insurance;( 2) cmbInsuranceType.addItem(LUXURYCAR);( 3) if (type.equals(LUXURYCAR) pp=new LuxuryCarPolicyProducer();.【实验结果】【实验小结】使用工厂方法访问并且初始化合适的类的对象,简化了应用程序,应用程序本

5、身不再含有大量的条件语句判定何时选取哪个类。其次,工厂方法实现了一些特殊的某个类的机制,尤其是层次结构不同的类需要不同的初始化方法的时候。.抽象工厂方法模式房屋信息【实验内容】在例 2.4 中设计并且实现了豪华(Super)和中等( Medum)别墅( House)和公寓(Condo)的查询。要求在该设计的基础上, 增加一个新的类SemiDetacher(半独立式楼宇),并且编写代码实现相应的查询功能。【添加代码】1、添加 SemiDetacher类:public interface SemiDetacherpublic String getSemiDetacherInfo();public

6、String getSemiDetacherFeatures();2、添加 SuperSemiDetacher类:public class SuperSemiDetacher implements SemiDetacherprivate String name;public SuperSemiDetacher(String cName)name = cName;public String getSemiDetacherInfo()return superSemiDetacher.html;public String getSemiDetacherFeatures()return Super S

7、emiDetacher ;3、 添加 MediumSemiDetacher类:public class MediumSemiDetacher implements SemiDetacher private String name;public MediumSemiDetacher(String cName).name = cName;public String getSemiDetacherInfo()return MediumSemiDetacher.html;public String getSemiDetacherFeatures()return Medium SemiDetacher

8、;4、添加 BuildingFactory:public abstract SemiDetacher getSemiDetacher();5、添加 MediumBuildingFactory :public SemiDetacher getSemiDetacher()return new MediumSemiDetacher(Medium SemiDetacher);6、添加 SuperBuildingFactory:public SemiDetacher getSemiDetacher()return new SuperSemiDetacher(Super SemiDetacher);7、添

9、加 GUI:( 1) public static final String SEMIDETACHER = SemiDetacher;( 2) cmbHouseType.addItem(SEMIDETACHER);( 3) if (type.equals(AbstractFactoryGUI.SEMIDETACHER) SemiDetacher cd = bf.getSemiDetacher(); String fileNm = cd.getSemiDetacherInfo(); putHouseInfoToScreen(fileNm);.【实验结果】【实验小结】当客户对象要从一个相关的产品组中

10、创建一个对象,而没有必要知道到底要创建哪个对象时, 可以使用抽象工厂模式。 如果不使用抽象工厂模式,创建对象的条件语句将会出现在客户程序的许多地方,程序的克维护性差。 抽象工厂模式帮助程序员避免了以上所述的重复的、复杂的条件语句, 提供必要的创建对象的接口。.实验二组合模式空军指挥系统【实验内容】在例 3.3 的设计中,添加一个空军大队(Wing)类,该类与 Squadron、Group类是平行的,因此应该继承了AirUnit 类。该类的写法与Squadron或者 Group类是类似的,所不同的是一个Wing 有 216 中类型的飞机。【添加代码】1、添加 Wing 类:public clas

11、s Wing extends AirUnitpublic static final String FEATURES = A Wing with 216 aircrafts; Airforce fighters = new Airforce162;Airforce bombers = new Airforce18;Airforce transporters= new Airforce18;Airforce eAircrafts = new Airforce18;public Wing()for(int k=0;k162;k+)/ need 162 fightersfor(int k=0;k18;

12、k+)/ need 18 bombersfor(int k=0;k18;k+)/ need 18 transportersfor(int k=0;k=A)&(nStr.charAt(0) =Z)| (nStr.charAt(0) =a)&(nStr.charAt(0) =z) & (len=5) ) for(int m=0; 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;return

13、 isValid;elsereturn false;.2、添加 CusInfoValidator:public abstract boolean isValidEmailAddr(String EmailAddr);3、添加 GUI:( 1) private JTextField txtCustomerName, txtAddress,txtZip,txtCellPhone,txtSSN, txtEmailAddr;( 2) private JLabel lblCustomerName, lblAddress,lblZip, lblCellphone, lblSSN, lblEmailAddr

14、;( 3) txtEmailAddr=new JTextField(20);( 4) lblEmailAddr= new JLabel(EmailAddr :);( 5) UIPanel.add(lblEmailAddr);UIPanel.add(txtEmailAddr);( 6) gridbag.setConstraints(lblEmailAddr, gbc); gbc.gridx = 1;gbc.gridy = 5;gridbag.setConstraints(txtEmailAddr, gbc);gbc.gridx = 0;gbc.gridy = 6;( 7) public Stri

15、ng getEmailAddr() return txtEmailAddr.getText();( 8) String emailaddr = getEmailAddr();( 9) if(cusInfo.isValidEmailAddr(emailaddr)=false) dataTextArea.append(nWrong format of EmailAddr.);elsedataTextArea.append(nCorrect format of EmailAddr.);.【实验结果】【实验小结】通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑

16、;复用了现存的类,解决了现存类和复用环境要求不一致的问题;将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码;一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说, 同一个适配器可以把适配者类和它的子类都适配到目标接口。对于对象适配器来说,更换适配器的实现过程比较复杂。.实验三桥接模式几何立体体积【实验内容】在例 3.14 中的设计实验层次类部分中,添加Ellipsoid (椭球)类,并且实现针对椭球体积的计算。【添加代码】1、添加椭球类:public class Ellipsoid implements GeoFormprivate double

17、aRadius;private double bRadius;private double cRadius;public Ellipsoid (double aRadius, double bRadius, double cRadius) this.aRadius = aRadius;this.bRadius = bRadius;this.cRadius = cRadius;public double computeV olume()double volume = 1.3333333*3.1415926* aRadius* bRadius* cRadius; return volume;2、添

18、加 GUI :( 1) private JTextField txtEllipsoidRadius_a;private JTextField txtEllipsoidRadius_b;private JTextField txtEllipsoidRadius_c;( 2) public static final String ELLIPSOID = Ellipsoid;( 3) cmbGeoForm.addItem(ELLIPSOID);( 4) else if(selection.equals(ELLIPSOID) )String a_radius = txtEllipsoidRadius_

19、a.getText();String b_radius = txtEllipsoidRadius_b.getText();String c_radius = txtEllipsoidRadius_c.getText();double a = Double.valueOf(a_radius);double b =Double.valueOf(b_radius);double c = Double.valueOf(c_radius);.form = new Ellipsoid(a, b, c);( 5) else if(selection.equals(ELLIPSOID) )displayNew

20、GUI( getTypePanel(ELLIPSOID);( 6) else if(type.equals(ELLIPSOID)JLabel lblRadius_a = newJLabel lblRadius_b = newJLabel lblRadius_c = newJLabel(Input Radius a);JLabel(Input Radius b);JLabel(Input Radius c);txtEllipsoidRadius_a = new JTextField(8);txtEllipsoidRadius_b = new JTextField(8);txtEllipsoidR

21、adius_c = new JTextField(8);GridBagLayout gridbag = new GridBagLayout();typePanel.setLayout(gridbag);GridBagConstraints gbc = new GridBagConstraints();typePanel.add(lblRadius_a);typePanel.add(lblRadius_b);typePanel.add(lblRadius_c);typePanel.add(txtEllipsoidRadius_a);typePanel.add(txtEllipsoidRadius

22、_b);typePanel.add(txtEllipsoidRadius_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.gridx = 0;gbc.gridy = 0;gridbag.setConstraints(lblRadius_a, gbc);gbc.gridx = 1;gbc.gr

23、idy = 0;gridbag.setConstraints(txtEllipsoidRadius_a, gbc);gbc.gridx = 0;gbc.gridy = 1;.gridbag.setConstraints(lblRadius_b, gbc);gbc.gridx = 1;gbc.gridy = 1;gridbag.setConstraints(txtEllipsoidRadius_b, gbc);gbc.gridx = 0;gbc.gridy = 2;gridbag.setConstraints(lblRadius_c, gbc);gbc.gridx = 1;gbc.gridy =

24、 2;gridbag.setConstraints(txtEllipsoidRadius_c, gbc);gbc.gridx = 0;gbc.gridy = 3;gridbag.setConstraints(lblMeasure, gbc);gbc.gridx = 1;gbc.gridy = 3;gridbag.setConstraints(cmbMeasure, gbc);【实验结果】【实验小结】通过这次实验我们大概理解了桥接模式,通过关联“抽象层次类”与“具体层次类”这一桥梁,将表示两个维度的层类(数据结构)粘贴在一起,形成更大的数据结构, 而这种变化又不会对现有的类产生影响,这种思路的终

25、极想法是将软件设计的抽象部分与实现部分分离,使它们都可以独立的变化。.访问者模式计算机部件销售软件【实验内容】在例 4.5 的设计中添加一个类SoundBox。该类实现接口ComputerParts,并且其他的计算机部件的类的结构类似。【添加代码】1、添加 SoundBox类:public class SoundBox implements ComputerPartspublic static final String NAME = SoundBox;private final double PRICE = 127.00;public static final String FEATURES

26、= SoundBox. X3K;public String getName()return NAME;public double getPrice()return PRICE;public String getDescription()return FEATURES;public void accept(Visitor v)System.out.println(SoundBox has been visited.);v.visitSoundBox (this);2、添加 GUI:( 1) String compParts= Case,Motherboard,Microprocessor,Mem

27、ory, DriveController,VideoCard,Fan,PowerSupply, HardDiskDrive,CDDrive,DVDDevice,Monitor, Keyboard,Mouse,SoundBox,Assembly,WholePC;( 2) for(int k=11; k17; k+)add(0, k, cPartsk);( 3) else if (source = cParts14) states14 = state;else if (source = cParts15)if(state = SELECTED)cParts1.setSelected(true);c

28、Parts8.setSelected(true);.else if (state = DESELECTED)cParts1.setSelected(false);cParts8.setSelected(false);states15=state;else if (source = cParts16)if(state = SELECTED)cParts0.setSelected(true);for(int k=11; k15; k+)cPartsk.setSelected(true);else if (state = DESELECTED)cParts0.setSelected(false);f

29、or(int k=11; k15; k+)cPartsk.setSelected(false);states16=state;( 4) else if(m=14) & (states14 = SELECTED) part = new SoundBox();msg.add(SoundBox);3、添加 Visitor:public abstract void visitSoundBox (SoundBoxe);4、添加 PriceVisitor:public void visitSoundBox (SoundBoxe)price = e.getPrice();partsPrices.add(ne

30、w Double(price);total += price;5、添加 PartsInfoVisitor:public void visitSoundBox (SoundBoxe)partInfo = e.getDescription();allOders = allOders + n + partInfo;.【实验结果】【实验小结】通过此次实验让我们更加深刻的理解了访问者模式,它在处理数据结构较稳定,但是作用于其上的操作需要经常变化的问题时时非常有效的,因此可以在不改变该结构体中的类的基础上定义一个新的操作,这个实验就是如此, 我们只需要添加新的类,然后调用accept(pv)方法就可以。.

31、实验四策略模式整数排序【实验内容】在例 4.13 的设计中的排序策略部分, 添加一个类 BidirectionaBubbleSort,进行“双向冒泡法排序”, 以便扩展该排序系统的功能。为了实现扩展功能, 需要相应地修改 Context 类与客户图形界面类StrategyGUI 。【添加代码】1、添加 BidirBubbleSort类:publicclass BidirBubbleSort implements SortAlgorithmpublic int sort(int nums,Context ct)ct.startExecution();int j;int limit = nums.

32、length;int st = -1;while(st limit)boolean flipped = false;st+;limit-;for(j = st; j numsj + 1)int T = numsj;numsj = numsj + 1;numsj + 1 = T;flipped = true;if(!flipped)ct.endExecution();.return nums;for(j = limit; -j = st;)if(numsj numsj + 1)int T = numsj;numsj = numsj + 1;numsj + 1 = T;flipped = true

33、;if(!flipped)ct.endExecution();return nums;ct.endExecution();return nums;2、添加 GUI :( 1) public static final String BidirBubble= BidirBubbleSort;( 2) cmbAlgorithm.addItem(BidirBubble);( 3) if (type.equals(BidirBubble) sa = new BidirBubbleSort();【实验结果】.【实验小结】通过此次实验让我们更加理解了策略模式的优势,实现了高内聚低耦合,它的应用场景是当有多个

34、仅在行为上不同但是相关的类存在时,采用策略模式提供一个为一个类配置多种行为之一的方法。此时增加双向冒泡排序法时, 不需要修改 Context 类的代码,只需要修改客户类( StrategyGUI)。状态模式交通信号灯【实验内容】在例 4.16 的设计中的交通信号灯状态部分,添加一个类BlueLight ,进行红 绿黄 蓝 红的状态变化,以便扩展该交通信号灯系统的状态。【添加代码】1、添加 BlueLight 类:import java.awt.Color;public class BlueLight extends TrafficLightpublic BlueLight() .state = BLUE;public Color setC

温馨提示

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

评论

0/150

提交评论