中南大学软件学院体系结构实验报告实验2.docx

上传人:b****8 文档编号:10688035 上传时间:2023-02-22 格式:DOCX 页数:21 大小:738.32KB
下载 相关 举报
中南大学软件学院体系结构实验报告实验2.docx_第1页
第1页 / 共21页
中南大学软件学院体系结构实验报告实验2.docx_第2页
第2页 / 共21页
中南大学软件学院体系结构实验报告实验2.docx_第3页
第3页 / 共21页
中南大学软件学院体系结构实验报告实验2.docx_第4页
第4页 / 共21页
中南大学软件学院体系结构实验报告实验2.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

中南大学软件学院体系结构实验报告实验2.docx

《中南大学软件学院体系结构实验报告实验2.docx》由会员分享,可在线阅读,更多相关《中南大学软件学院体系结构实验报告实验2.docx(21页珍藏版)》请在冰豆网上搜索。

中南大学软件学院体系结构实验报告实验2.docx

中南大学软件学院体系结构实验报告实验2

 

《软件体系结构》

实验报告

 

项目名称实验2设计模式实验一

专业班级软件1403

学号3901140302

姓名温睿诚

 

实验成绩:

批阅教师:

 

2016年12月23日

实验2设计模式实验一

实验学时:

4

每组人数:

1

实验类型:

3(1:

基础性2:

综合性3:

设计性4:

研究性)

实验要求:

1(1:

必修2:

选修3:

其它)

实验类别:

3(1:

基础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。

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

三、实验要求

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

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

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

四、实验步骤

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

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

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

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

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

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

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

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

五、实验结果

1.重构之后的类图:

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

单一职责原则,使用工厂把类的创建和使用分开。

开闭原则,通过抽象工厂和抽象产品类,使得增加新的图形很方便。

里氏代换原则,客户端通过抽象工厂类编程,运行时读取配置文件信息,用具体工厂类覆盖。

依赖倒转原则,客户端对抽象工厂类编程而不是具体工厂类编程。

迪米特法则,客户端只对三个类进行交互,不管以后增加多少个新的图形。

 

2.类图:

实现代码:

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

interfaceShape{

voiddraw()throwsUnSupportedShapeException;

voiderase();

}

publicclassCircleimplementsShape{

@Override

publicvoiddraw(){

System.out.println("圆形绘制");

}

@Override

publicvoiderase(){

System.out.println("圆形擦除");

}

publicCircle(){

System.out.println("圆形创建");

}

}

publicclassErrorShapeimplementsShape{

privateStringtype=null;

@Override

publicvoiddraw()throwsUnSupportedShapeException{

thrownewUnSupportedShapeException("不支持"+type+"这种图形");

}

@Override

publicvoiderase(){

}

publicErrorShape(Stringmsg){

type=msg;

}

}

publicclassRectimplementsShape{

@Override

publicvoiddraw(){

System.out.println("方形绘制");

}

@Override

publicvoiderase(){

System.out.println("方形擦除");

}

publicRect(){

System.out.println("方形创建");

}

}

publicclassTriangleimplementsShape{

@Override

publicvoiddraw(){

System.out.println("三角形绘制");

}

@Override

publicvoiderase(){

System.out.println("三角形擦除");

}

publicTriangle(){

System.out.println("三角形创建");

}

}

publicclassSimpleFactory{

publicstaticShapegetShape(Stringtype)throwsUnSupportedShapeException{

Shapeshape=null;

Stringstring=type.toLowerCase();

switch(string){

case"circle":

shape=newCircle();

break;

case"rectangle":

shape=newRect();

break;

case"triangle":

shape=newTriangle();

break;

default:

shape=newErrorShape(string);

break;

}

returnshape;

}

publicstaticvoidmain(String[]args){

try{

Shapea;

Stringtype=XMLUtil.getShapeType();

a=getShape(type);

a.draw();

a.erase();

}catch(Exceptione){

e.printStackTrace();

}

}

}

publicclassUnSupportedShapeExceptionextendsException{

publicUnSupportedShapeException(Stringmsg){

super(msg);

}

}

publicclassXMLUtil{

publicstaticStringgetShapeType(){

try{

//创建文档对象

DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance();

DocumentBuilderbuilder=builderFactory.newDocumentBuilder();

Documentdocument=builder.parse(newFile("config.xml"));

NodeListnodeList=document.getElementsByTagName("shapeType");

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

StringshapeType=node.getNodeValue().trim();

returnshapeType;

}catch(Exceptione){

e.printStackTrace();

returnnull;

}

}

}

 

3.类图:

实现代码:

publicinterfaceReaderFactory{

ImageReadercreateReader();

}

publicinterfaceImageReader{

voidreadImg(StringfileName);

}

publicclassGIFReaderFactoryimplementsReaderFactory{

@Override

publicImageReadercreateReader(){

//配置环境等比如连接数据库

ImageReaderreader=newGifReader();

//初始化reader的数据等

returnreader;

}

}

publicclassJPGReaderFactoryimplementsReaderFactory{

@Override

publicImageReadercreateReader(){

//配置环境等比如连接数据库

ImageReaderreader=newJpgReader();

//初始化reader的数据等

returnreader;

}

}

publicclassGifReaderimplementsImageReader{

@Override

publicvoidreadImg(StringfileName){

System.out.println("GIF图片读取器读取"+fileName);

}

publicGifReader(){}

}

publicclassJpgReaderimplementsImageReader{

@Override

publicvoidreadImg(StringfileName){

System.out.println("JPG图片读取器读取"+fileName);

}

publicJpgReader(){}

}

publicclassXMLUtil{

publicstaticObjectgetImgReader(){

try{

//创建文档对象

DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance();

DocumentBuilderbuilder=builderFactory.newDocumentBuilder();

Documentdocument=builder.parse(newFile("config.xml"));

NodeListnodeList=document.getElementsByTagName("imgReaderFactory");

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

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

Classc=Class.forName(className);

Objecto=c.newInstance();

returno;

}catch(Exceptione){

e.printStackTrace();

returnnull;

}

}

}

publicclassTest{

publicstaticvoidmain(String[]args){

ReaderFactoryfactory=(ReaderFactory)XMLUtil.getImgReader();

ImageReaderreader=factory.createReader();

reader.readImg("1.?

?

?

");

}

}

4.类图:

实现代码:

publicclassButton{

}

publicclassTextField{

}

publicclassZuhekuang{

}

publicinterfaceSkinFactory{

ButtoncreateButton();

TextFieldcreateTextField();

ZuhekuangcreateZuhekuang();

}

publicclassSpringButtonextendsButton{

}

publicclassSpringTextFieldextendsTextField{

}

publicclassSpringZuhekuangextendsZuhekuang{

}

publicclassSpringSkinFactoryimplementsSkinFactory{

@Override

publicButtoncreateButton(){

returnnewSpringButton();

}

@Override

publicTextFieldcreateTextField(){

returnnewSpringTextField();

}

@Override

publicZuhekuangcreateZuhekuang(){

returnnewSpringZuhekuang();

}

}

publicclassSummerButtonextendsButton{

}

publicclassSummerTextFieldextendsTextField{

}

publicclassSummerZuhekuangextendsZuhekuang{

}

publicclassSummerSkinFactoryimplementsSkinFactory{

@Override

publicButtoncreateButton(){

returnnewSummerButton();

}

@Override

publicTextFieldcreateTextField(){

returnnewSummerTextField();

}

@Override

publicZuhekuangcreateZuhekuang(){

returnnewSummerZuhekuang();

}

}

publicclassXMLUtil{

publicstaticObjectgetControllerFactory(){

try{

//创建文档对象

DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance();

DocumentBuilderbuilder=builderFactory.newDocumentBuilder();

Documentdocument=builder.parse(newFile("config.xml"));

NodeListnodeList=document.getElementsByTagName("skin");

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

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

Classc=Class.forName(className);

Objecto=c.newInstance();

returno;

}catch(Exceptione){

e.printStackTrace();

returnnull;

}

}

}

5.类图:

实现代码:

publicclassDuoli{

privatestaticfinalintINSTANCE_NUMBER=3;

privatestaticintcount=INSTANCE_NUMBER-1;

privatestaticfinalDuoli[]duolis=newDuoli[INSTANCE_NUMBER];

static{

System.out.println("加载Duoli这个类了");

for(inti=0;i

Duoliduoli=newDuoli();

duolis[i]=duoli;

}

}

privateDuoli(){

System.out.println("newDuoli()了");

}

privatestaticDuoligetInstance(){

synchronized(Duoli.class){

count=count+1>=INSTANCE_NUMBER?

0:

count+1;

}

returnduolis[count];

}

publicstaticvoidmain(String[]args){

Duoliduoli1=Duoli.getInstance();

Duoliduoli2=Duoli.getInstance();

Duoliduoli3=Duoli.getInstance();

Duoliduoli4=Duoli.getInstance();

System.out.println(duoli1);

System.out.println(duoli2);

System.out.println(duoli3);

System.out.println(duoli4);

}

}

输出

加载Duoli这个类了

new

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1