软件设计模式与体系结构Word下载.docx
- 文档编号:19161296
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:24
- 大小:212.41KB
软件设计模式与体系结构Word下载.docx
《软件设计模式与体系结构Word下载.docx》由会员分享,可在线阅读,更多相关《软件设计模式与体系结构Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
"
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()
{
SuperSemiDetacher"
3、添加MediumSemiDetacher类:
publicclassMediumSemiDetacherimplementsSemiDetacher
privateStringname;
publicMediumSemiDetacher(StringcName)
publicStringgetSemiDetacherInfo()
MediumSemiDetacher.html"
MediumSemiDetacher"
4、添加BuildingFactory:
publicabstractSemiDetachergetSemiDetacher();
5、添加MediumBuildingFactory:
publicSemiDetachergetSemiDetacher()
returnnewMediumSemiDetacher("
MediumSemiDetacher"
);
6、添加SuperBuildingFactory:
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
18;
//need18bombers
//need18transporters
//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'
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){
if(b==0){
returnisValid;
else{
returnfalse;
2、添加CusInfoValidator:
publicabstractbooleanisValidEmailAddr(StringEmailAddr);
(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{
\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;
(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;
gridbag.setConstraints(txtEllipsoidRadius_a,gbc);
gbc.gridy=1;
gridbag.setConstraints(lblRadius_b,gbc);
gridbag.setConstraints(txtEllipsoidRadius_b,gbc);
gbc.gridy=2;
gridbag.setConstraints(lblRadius_c,gbc);
gridbag.setConstraints(txtEllipsoidRadius_c,gbc);
gbc.gridx=0;
gbc.gridy=3;
gridbag.setConstraints(lblMeasure,gbc);
gridbag.setConstraints(cmbMeasure,gbc);
通过这次实验我们大概理解了桥接模式,通过关联“抽象层次类”与“具体层次类”这一桥梁,将表示两个维度的层类(数据结构)粘贴在一起,形成更大的数据结构,而这种变化又不会对现有的类产生影响,这种思路的终极想法是将软件设计的抽象部分与实现部分分离,使它们都可以独立的变化。
访问者模式——计算机部件销售软件
在例4.5的设计中添加一个类SoundBox。
该类实现接口ComputerParts,并且其他的计算机部件的类的结构类似。
1、添加SoundBox类:
publicclassSoundBoximplementsComputerParts{
publicstaticfinalStringNAME="
SoundBox"
privatefinaldoublePRICE=127.00;
SoundBox.X3K"
publicStringgetName(){
returnNAME;
publicdoublegetPrice(){
returnPRICE;
publicvoidaccept(Visitorv){
System.out.println("
SoundBoxhasbeenvisited."
v.visitSoundBox(this);
2、添加GUI:
(1)String[]compParts={"
Case"
"
Motherboard"
Microprocessor"
Memory"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件设计 模式 体系结构