软件体系结构实验二Word文档格式.doc

上传人:wj 文档编号:3674994 上传时间:2023-05-02 格式:DOC 页数:62 大小:2.32MB
下载 相关 举报
软件体系结构实验二Word文档格式.doc_第1页
第1页 / 共62页
软件体系结构实验二Word文档格式.doc_第2页
第2页 / 共62页
软件体系结构实验二Word文档格式.doc_第3页
第3页 / 共62页
软件体系结构实验二Word文档格式.doc_第4页
第4页 / 共62页
软件体系结构实验二Word文档格式.doc_第5页
第5页 / 共62页
软件体系结构实验二Word文档格式.doc_第6页
第6页 / 共62页
软件体系结构实验二Word文档格式.doc_第7页
第7页 / 共62页
软件体系结构实验二Word文档格式.doc_第8页
第8页 / 共62页
软件体系结构实验二Word文档格式.doc_第9页
第9页 / 共62页
软件体系结构实验二Word文档格式.doc_第10页
第10页 / 共62页
软件体系结构实验二Word文档格式.doc_第11页
第11页 / 共62页
软件体系结构实验二Word文档格式.doc_第12页
第12页 / 共62页
软件体系结构实验二Word文档格式.doc_第13页
第13页 / 共62页
软件体系结构实验二Word文档格式.doc_第14页
第14页 / 共62页
软件体系结构实验二Word文档格式.doc_第15页
第15页 / 共62页
软件体系结构实验二Word文档格式.doc_第16页
第16页 / 共62页
软件体系结构实验二Word文档格式.doc_第17页
第17页 / 共62页
软件体系结构实验二Word文档格式.doc_第18页
第18页 / 共62页
软件体系结构实验二Word文档格式.doc_第19页
第19页 / 共62页
软件体系结构实验二Word文档格式.doc_第20页
第20页 / 共62页
亲,该文档总共62页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

软件体系结构实验二Word文档格式.doc

《软件体系结构实验二Word文档格式.doc》由会员分享,可在线阅读,更多相关《软件体系结构实验二Word文档格式.doc(62页珍藏版)》请在冰点文库上搜索。

软件体系结构实验二Word文档格式.doc

基础2:

专业基础3:

专业4:

一、实验目的

1.熟练使用面向对象设计原则对系统进行重构;

2.熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的创建型设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、组合模式、外观模式和代理模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。

二、实验内容

1.在某图形库API中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:

在该图形库中,每个图形类(如Circle、Triangle等)的init()方法用于初始化所创建的图形,setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。

客户类(Client)在使用该图形库时发现存在如下问题:

①由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;

②在图形库中增加并使用新的图形时需要修改客户类源代码;

③客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。

现需要根据面向对象设计原则对该系统进行重构,要求如下:

①隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;

②客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。

绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。

2.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法,要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常,绘制类图并编程模拟实现。

3.现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。

图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。

试使用工厂方法模式设计该程序,绘制类图并编程模拟实现。

需充分考虑系统的灵活性和可扩展性。

4.某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。

不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:

该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。

试使用抽象工厂模式设计该皮肤库,绘制类图并编程模拟实现。

5.使用单例模式的思想实现多例模式,确保系统中某个类的对象只能存在有限个,例如两个或三个,设计并编写代码实现一个多例类。

6.使用单例模式设计一个多文档窗口(注:

在JavaAWT/Swing开发中可使用JDesktopPane和JInternalFrame来实现),要求在主窗体中某个内部子窗体只能实例化一次,即只能弹出一个相同的子窗体,如下图所示,编程实现该功能。

(注:

用C#或C++实现类似功能也可以)

7.现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch的binarySearch(int[],int)方法实现了二分查找算法。

试使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。

绘制类图并编程实现。

(要求实现快速排序和二分查找,使用对象适配器实现)

8.使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。

绘制类图并编程模拟实现。

9.某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全部拷贝到移动存储介质(例如MMC卡或SD卡)中。

在实现过程中需要与多个已有的类进行交互,例如通讯录管理类、短信管理类等,为了降低系统的耦合度,试使用外观模式来设计并编程模拟实现该一键备份功能。

10.某信息系统需要提供一个数据处理和报表显示模块,该模块可以读取不同类型的文件中的数据并将数据转换成XML格式,然后对数据进行统计分析,最后以报表方式来显示数据。

由于该过程需要涉及到多个类,试使用外观模式设计该数据处理和报表显示模块。

考虑到有些文件本身已经是XML格式,无须进行格式转换,为了让系统具有更好的扩展性,在系统设计中可以引入抽象外观类。

11.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法method()调用之前输出“方法method()被调用,调用时间为2014-11-510:

10:

10”,调用之后如果没有抛异常则输出“方法method()调用成功”,否则输出“方法method()调用失败”。

在代理类中调用真实业务类的业务方法,使用代理模式设计该日志记录模块的结构,绘制类图并编程模拟实现。

12.某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:

(1)在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统;

(2)在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。

该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。

试使用代理模式设计并编程模拟实现该收费商务信息查询系统。

【提示:

使用保护代理和智能引用代理】

三、实验要求

1.选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图;

2.结合实例,正确无误地绘制简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、组合模式、外观模式和代理模式的模式结构图;

3.使用任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、组合模式、外观模式和代理模式实例,代码运行正确无误。

四、实验步骤

1.选择合适的面向对象设计原则对系统进行重构,使用PowerDesigner绘制重构之后的类图;

2.结合实例,使用PowerDesigner绘制简单工厂模式实例结构图并用面向对象编程语言实现该模式实例;

3.结合实例,使用PowerDesigner绘制工厂方法模式实例结构图并用面向对象编程语言实现该模式实例;

4.结合实例,使用PowerDesigner绘制抽象工厂模式实例结构图并用面向对象编程语言实现该模式实例;

5.结合实例,使用PowerDesigner绘制多例模式实例结构图并用面向对象编程语言实现该模式实例;

6.结合实例,使用PowerDesigner绘制单例模式实例结构图并用面向对象编程语言实现该模式实例。

7.结合实例,使用PowerDesigner绘制适配器模式实例结构图并用面向对象编程语言实现该模式实例;

8.结合实例,使用PowerDesigner绘制组合模式实例结构图并用面向对象编程语言实现该模式实例;

9.结合实例,使用PowerDesigner绘制外观模式实例结构图并用面向对象编程语言实现该模式实例;

10.结合实例,使用PowerDesigner绘制外观模式实例结构图并用面向对象编程语言实现该模式实例;

11.结合实例,使用PowerDesigner绘制代理模式实例结构图并用面向对象编程语言实现该模式实例;

12.结合实例,使用PowerDesigner绘制代理模式实例结构图并用面向对象编程语言实现该模式实例。

五、实验结果

1.重构之后的类图:

解:

重构后的类图

由于隔离图形的创建和使用,说明使用了工厂,因为工厂类能够实现对象的隔离和创建的分离,客户端不直接创建图像对象,而且不需要关心具体图形类的类名,就说明是使用了配置文件,满足了开闭原则。

本题第二句话,由于客户端可以方便地更换图形或者使用新增图形,无须针对具体图形类编程,说明了要针对的是抽象接口或对象类编程,一定程度上满足依赖倒转原则。

那么我所重构的思想如下:

1.采用简单工厂模式,而不是工厂方法模式,原因很简单,原题说过,创建窗口时每次只需要使用图形库中的一种图形

2.采用抽象接口定义图形

3.采用配置文件

重构过程中所使用的面向对象设计原则及简要说明:

n使用的设计原则

使用原则

原则简介

使用了该原则的体现

开闭原则

软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能

在增加一个新图形时,只需要增加一个新图形类和一个新图形的工厂类,然后将新图形的工厂类放入配置文件,从而使增加新图形时不用修改源代码,完全符合“开闭原则”

单一职责原则

类的职责单一,不能将太多的职责放在一个类中

原先的客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复

杂,导致客户类代码冗长且难以维护。

重构之后的客户类只需要创建抽象工厂,由具体的图形工厂创建具体的图形对象,客户类只负责使用相应的图形即可,不需要直接创建图形,实现了单一职责原则;

依赖倒置原则

要针对抽象层编程,而不要针对具体类编程

客户类完全只针对抽象编程,没有依赖于具体的细节,只需要针对GraphFactory工厂和Graph抽象编程

里氏代换原则

在软件系统中,一个可以接受基类对象的地方,必然可以接受一个子类对象

客户类只需要创建GraphFactory抽象工厂类,运行时,然后根据配置文件生成具体工厂,再利用具体工厂生成具体的图形

2.类图:

实现代码:

//代码颜色使用黑色,字体使用TimesNewRoman或Arial,字号为五号,如

Shape类

publicabstractclassShape{

publicvoiddraw(){

//TODO:

implement

}

publicvoiderase(){

}

}

Circle类

publicclassCircleextendsShape{

@Override

publicvoiddraw(){

//TODOAuto-generatedmethodstub

System.out.println("

Circle'

sdrawfunction!

"

);

}

publicvoiderase(){

seraseFunction!

Rectangle类

publicclassRectangleextendsShape{

Rectangle'

ShapeFactory类

publicclassShapeFactory{

publicShapecreateShape(Stringtype){

try{

if(type.equals("

Circle"

)){

System.out.println("

CreateCircleObject!

returnnewCircle();

}elseif(type.equals("

Rectangle"

System.out.println("

CreateRectangleObject!

returnnewRectangle();

Triangle"

CreateTriangleObject!

returnnewTriangle();

}else{

thrownewUnsupportedShapeException("

不能创建该类型!

}

}catch(UnsupportedShapeExceptione){

System.out.println(e);

returnnull;

UnsupportedShapeException类

publicclassUnsupportedShapeExceptionextendsException{

publicUnsupportedShapeException(Stringmessage){

super(message);

//TODO:

Auto-generatedconstructorstub

为了灵活性,增加了配置文件和处理配置文件的函数

XMLUtilShape类

importjava.io.File;

importjavax.xml.parsers.DocumentBuilder;

importjavax.xml.parsers.DocumentBuilderFactory;

importorg.w3c.dom.Document;

importorg.w3c.dom.Node;

importorg.w3c.dom.NodeList;

publicclassXMLUtilShape{

publicstaticStringgetClassName(){

try{

//创建文档对象

DocumentBuilderFactorydocumentBuilderFactory=DocumentBuilderFactory.newInstance();

DocumentBuilderdocumentBuilder=documentBuilderFactory.newDocumentBuilder();

Documentdoc;

doc=documentBuilder.parse(newFile("

config.xml"

));

//获取工厂具体名称

NodeListnodeList=doc.getElementsByTagName("

className"

NodeclassNode=nodeList.item(0).getFirstChild();

StringclassName=classNode.getNodeValue().trim();

returnclassName;

}catch(Exceptione){

System.out.println(e.getMessage());

returnnull;

}

Client函数

publicclassClient{

publicstaticvoidmain(String[]args){

Shapeshape;

StringclassName=XMLUtilShape.getClassName();

shape=ShapeFactory.createShape(className);

配置文件

<

?

xmlversion="

1.0"

encoding="

UTF-8"

>

config>

<

className>

Rectangle<

/className>

/config>

l运行结果

配置文件:

结果为:

改变配置文件可以生成另一个

3.类图:

ImageReader接口

publicinterfaceImageReader{

publicvoidreadImage();

ImageReaderFactory抽象类

publicabstractclassImageReaderFactory{

publicabstractImageReadercreateImageReader();

JpgReader类

publicclassJpgReaderimplementsImageReader{

publicvoidreadImage(){

读取Jpg"

JpgReaderFactory类

publicclassJpgReaderFactoryextendsImageReaderFactory{

publicImageReadercreateImageReader(){

使用Jpg"

returnnewJpgReader();

GifReader类

publicclassGifReaderimplementsImageReader{

读取GIF"

GifReaderFactory类

publicclassGifReaderFactoryextendsImageReaderFactory{

使用Gif"

returnnewGifReader();

为了使得使得系统灵活具有可扩展性,所以我使用了配置文件,以下是调用的客户类代码和配置文件处理以及配置文件

Client类

publicclassclient{

ImageReaderimageReader;

ImageReaderFactoryfactory;

factory=(ImageReaderFactory)XMLUtilBean.getClassByConfig();

imageReader=factory.createImageReader();

imageReader.readImage();

XMLUtilBean类

publicclassXMLUtilBean{

publicstaticObjectgetClassByConfig(){

DocumentBuilderdocumentBuilder=docume

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

当前位置:首页 > 农林牧渔 > 林学

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

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