软件设计模式和体系结构.docx

上传人:b****2 文档编号:1106065 上传时间:2023-04-30 格式:DOCX 页数:28 大小:211.56KB
下载 相关 举报
软件设计模式和体系结构.docx_第1页
第1页 / 共28页
软件设计模式和体系结构.docx_第2页
第2页 / 共28页
软件设计模式和体系结构.docx_第3页
第3页 / 共28页
软件设计模式和体系结构.docx_第4页
第4页 / 共28页
软件设计模式和体系结构.docx_第5页
第5页 / 共28页
软件设计模式和体系结构.docx_第6页
第6页 / 共28页
软件设计模式和体系结构.docx_第7页
第7页 / 共28页
软件设计模式和体系结构.docx_第8页
第8页 / 共28页
软件设计模式和体系结构.docx_第9页
第9页 / 共28页
软件设计模式和体系结构.docx_第10页
第10页 / 共28页
软件设计模式和体系结构.docx_第11页
第11页 / 共28页
软件设计模式和体系结构.docx_第12页
第12页 / 共28页
软件设计模式和体系结构.docx_第13页
第13页 / 共28页
软件设计模式和体系结构.docx_第14页
第14页 / 共28页
软件设计模式和体系结构.docx_第15页
第15页 / 共28页
软件设计模式和体系结构.docx_第16页
第16页 / 共28页
软件设计模式和体系结构.docx_第17页
第17页 / 共28页
软件设计模式和体系结构.docx_第18页
第18页 / 共28页
软件设计模式和体系结构.docx_第19页
第19页 / 共28页
软件设计模式和体系结构.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

软件设计模式和体系结构.docx

《软件设计模式和体系结构.docx》由会员分享,可在线阅读,更多相关《软件设计模式和体系结构.docx(28页珍藏版)》请在冰点文库上搜索。

软件设计模式和体系结构.docx

软件设计模式和体系结构

 

计算机科学与技术学院

《软件设计模式与体系结构》

课程作业

(一)

(2016/2017学年第二学期)

 

学生姓名:

雷君

学生专业:

软件工程

学生班级:

142601

学生学号:

201426170108

指导教师:

王飞

 

目录

实验一1

工厂方法模式——汽车保险1

抽象工厂方法模式——房屋信息3

实验二6

组合模式——空军指挥系统6

适配器模式——客户信息验证8

实验三11

桥接模式——几何立体体积11

访问者模式——计算机部件销售软件14

实验四17

策略模式——整数排序17

状态模式——交通信号灯19

实验五21

MVC软件体系结构21

实验一

工厂方法模式——汽车保险

【实验内容】

在例2.3的汽车保险管理应用程序实例上添加一个名为LuxuryCarInsurance的类,并且,该类要与其他的类一样能执行相应的功能。

【添加代码】

1、添加LuxuryCarInsurance类:

publicclassLuxuryCarInsuranceimplementsAutoInsurance

{

privateStringdescription;

publicStringgetInsuranceDescription()

{

description="LuxuryCarInsurance:

\n\nLuxuryCarInsurancecoveragepays

formedicalbills"+

"lostwages,rehabilitation,treatmentand/or"+

"funeralcostsforanyoneinjuredorkilled"+

"byyourcar.Suchcoveragewillalsopayfor"+

"painandsufferingdamageswhenathird"+

"partysuccessfullysues.";

returndescription;

}

}

2、添加LuxuryCarPolicyProducer类:

publicclassLuxuryCarPolicyProducerimplementsPolicyProducer

{

publicAutoInsurancegetPolicyObj()//Fruitfactory()

{

returnnewLuxuryCarInsurance();

}

}

3、添加GUI:

(1)publicstaticfinalStringLUXURYCAR="LuxuryCarInsurance";

(2)cmbInsuranceType.addItem(LUXURYCAR);

(3)if(type.equals(LUXURYCAR)){

pp=newLuxuryCarPolicyProducer();

}

【实验结果】

 

【实验小结】

使用工厂方法访问并且初始化合适的类的对象,简化了应用程序,应用程序本身不再含有大量的条件语句判定何时选取哪个类。

其次,工厂方法实现了一些特殊的某个类的机制,尤其是层次结构不同的类需要不同的初始化方法的时候。

 

抽象工厂方法模式——房屋信息

【实验内容】

在例2.4中设计并且实现了豪华(Super)和中等(Medum)别墅(House)和公寓(Condo)的查询。

要求在该设计的基础上,增加一个新的类SemiDetacher(半独立式楼宇),并且编写代码实现相应的查询功能。

【添加代码】

1、添加SemiDetacher类:

publicinterfaceSemiDetacher

{

publicStringgetSemiDetacherInfo();

publicStringgetSemiDetacherFeatures();

}

2、添加SuperSemiDetacher类:

publicclassSuperSemiDetacherimplementsSemiDetacher

{

privateStringname;

publicSuperSemiDetacher(StringcName)

{

name=cName;

}

publicStringgetSemiDetacherInfo()

{

return"superSemiDetacher.html";

}

publicStringgetSemiDetacherFeatures()

{

return"SuperSemiDetacher";

}

}

3、添加MediumSemiDetacher类:

publicclassMediumSemiDetacherimplementsSemiDetacher

{

privateStringname;

publicMediumSemiDetacher(StringcName)

{

name=cName;

}

publicStringgetSemiDetacherInfo()

{

return"MediumSemiDetacher.html";

}

publicStringgetSemiDetacherFeatures()

{

return"MediumSemiDetacher";

}

}

4、添加BuildingFactory:

publicabstractSemiDetachergetSemiDetacher();

5、添加MediumBuildingFactory:

publicSemiDetachergetSemiDetacher()

{

returnnewMediumSemiDetacher("MediumSemiDetacher");

}

6、添加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中类型的飞机。

【添加代码】

1、添加Wing类:

publicclassWingextendsAirUnit{

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();

}

}

2、添加GUI:

(1)privateString[]AirForceUnit={"SQUADRON","GROUP","WING"};

(2)add(1,6,airCheckBox[13]);

(3)elseif((m==13)&&(ckBoxStates[13]==SELECTED)){

unit=newWing();

airUnits.attach(unit);

unitInfo=unit.getDescription();

}

【实验结果】

【实验小结】

我们这样来简单的理解组合模式,组合模式就是把一些现有的对象或者元素,经过组合后组成新的对象,新的对象提供内部方法,可以让我们很方便的完成这些元素或者内部对象的访问和操作。

我们也可以把组合对象理解成一个容器,容器提供各种访问其内部对象或者元素的API,我们只需要使用这些方法就可以操作它了。

适配器模式——客户信息验证

【实验内容】

关于例3.7的用于验证客户信息的离架产品类CusInfoValidation的功能扩展问题。

要求使用适配器模式。

【添加代码】

1、添加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

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;

}

}

2、添加CusInfoValidator:

publicabstractbooleanisValidEmailAddr(StringEmailAddr);

3、添加GUI:

(1)privateJTextFieldtxtCustomerName,txtAddress,txtZip,txtCellPhone,txtSSN,

txtEmailAddr;

(2)privateJLabellblCustomerName,lblAddress,lblZip,lblCellphone,lblSSN,

lblEmailAddr;

(3)txtEmailAddr=newJTextField(20);

(4)lblEmailAddr=newJLabel("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)publicStringgetEmailAddr(){

returntxtEmailAddr.getText();

}

(8)Stringemailaddr=getEmailAddr();

(9)if(cusInfo.isValidEmailAddr(emailaddr)==false){

dataTextArea.append("\nWrongformatofEmailAddr.");

}

else{

dataTextArea.append("\nCorrectformatofEmailAddr.");

}

 

【实验结果】

【实验小结】

通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。

这样做更简单、更直接、更紧凑;复用了现存的类,解决了现存类和复用环境要求不一致的问题;将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码; 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

对于对象适配器来说,更换适配器的实现过程比较复杂。

 

实验三

桥接模式——几何立体体积

【实验内容】

在例3.14中的设计实验层次类部分中,添加Ellipsoid(椭球)类,并且实现针对椭球体积的计算。

【添加代码】

1、添加椭球类:

publicclassEllipsoidimplementsGeoForm{

privatedoubleaRadius;

privatedoublebRadius;

privatedoublecRadius;

publicEllipsoid(doubleaRadius,doublebRadius,doublecRadius){

this.aRadius=aRadius;

this.bRadius=bRadius;

this.cRadius=cRadius;

}

publicdoublecomputeVolume(){

doublevolume=1.3333333*3.1415926*aRadius*bRadius*cRadius;

returnvolume;

}

}

2、添加GUI:

(1)privateJTextFieldtxtEllipsoidRadius_a;

privateJTextFieldtxtEllipsoidRadius_b;

privateJTextFieldtxtEllipsoidRadius_c;

(2)publicstaticfinalStringELLIPSOID="Ellipsoid";

(3)cmbGeoForm.addItem(ELLIPSOID);

(4)elseif(selection.equals(ELLIPSOID)){

Stringa_radius=txtEllipsoidRadius_a.getText();

Stringb_radius=txtEllipsoidRadius_b.getText();

Stringc_radius=txtEllipsoidRadius_c.getText();

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");

txtEllipsoidRadius_a=newJTextField(8);

txtEllipsoidRadius_b=newJTextField(8);

txtEllipsoidRadius_c=newJTextField(8);

GridBagLayoutgridbag=newGridBagLayout();

typePanel.setLayout(gridbag);

GridBagConstraintsgbc=newGridBagConstraints();

typePanel.add(lblRadius_a);

typePanel.add(lblRadius_b);

typePanel.add(lblRadius_c);

typePanel.add(txtEllipsoidRadius_a);

typePanel.add(txtEllipsoidRadius_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.gridy=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=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);

}

【实验结果】

【实验小结】

通过这次实验我们大概理解了桥接模式,通过关联“抽象层次类”与“具体层次类”这一桥梁,将表示两个维度的层类(数据结构)粘贴在一起,形成更大的数据结构,而这种变化又不会对现有的类产生影响,这种思路的终极想法是将软件设计的抽象部分与实现部分分离,使它们都可以独立的变化。

访问者模式——计算机部件销售软件

【实验内容】

在例4.5的设计中添加一个类SoundBox。

该类实现接口ComputerParts,并且其他的计算机部件的类的结构类似。

【添加代码】

1、添加SoundBox类:

publicclassSoundBoximplementsComputerParts{

publicstaticfinalStringNAME="SoundBox";

privatefinaldoublePRICE=127.00;

publicstaticfinalStringFEATURES="SoundBox.X3K";

publicStringgetName(){

returnNAME;

}

publicdoublegetPrice(){

returnPRICE;

}

publicStringgetDescription(){

returnFEATURES;

}

pu

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2