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

上传人:scccc 文档编号:14701563 上传时间:2022-02-15 格式:DOCX 页数:25 大小:381.72KB
返回 下载 相关 举报
中南大学软件学院体系结构实验报告-实验2.docx_第1页
第1页 / 共25页
中南大学软件学院体系结构实验报告-实验2.docx_第2页
第2页 / 共25页
中南大学软件学院体系结构实验报告-实验2.docx_第3页
第3页 / 共25页
中南大学软件学院体系结构实验报告-实验2.docx_第4页
第4页 / 共25页
中南大学软件学院体系结构实验报告-实验2.docx_第5页
第5页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

1、软件体系结构实验报告项目名称 实验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和任意一种面向对象编程语言实现几种常见的创建型设计模式和结构型设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式和组合模式

2、,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。、实验内容1 在某图形库 API中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显 示图形,图形库设计人员设计的初始类图如下所示:CircleTrian gleRecta ngle+in it ():void+setColor ():void+fill ():void+setSize ():void+display ():void+in it ():void+setColor ():void+fill ():void+setSize ():void+display ():void+in it ():void+s

3、etColor ():void+fill ():void+setSize ():void+display ():void在该图形库中,每个图形类(如Circle、Triangle 等)的init()方法用于初始化所创建的Clie nt图形,setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize() 方法用于设置图形的大小,display。方法用于显示图形。客户类(Client)在使用该图形库时发现存在如下问题: 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修 改客户类源代码; 在图形库中增加并使用新的图形时需要修改客户类

4、源代码; 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复 杂,导致客户类代码冗长且难以维护。现需要根据面向对象设计原则对该系统进行重构,要求如下: 隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形 时无须直接创建图形对象,甚至不需要关心具体图形类类名; 客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭 原则。绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。2使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等的绘图工具类

5、,每个几何图形均具有绘制Draw()和擦除Erase()两个方法,要求在绘制不支持的几何图形时,抛出一个Un supportedShapeException异常,绘制类图并编程模拟实现。3. 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG 图片读取器(JpgReader)用于读取JPG格式的图片。图片读取器对象通过图片读取器工厂 ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器 的工厂方法

6、,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。 试使用工厂方法模式设计该程序,绘制类图并编程模拟实现。需充分考虑系统的灵活性和可扩展性。4. 某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。不同的皮肤将 提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:该皮肤库需要具备良好的灵活性和可扩展性, 用户可以自由选择不同的皮肤, 开发人员 可以在不修改既有代码的基础上增加新的皮肤。 试使用抽象工厂模式设计该皮肤库, 绘制类 图并编程模拟实现。5. 使用单例模式的思想实现多例模式,确保系统中某个类的对象只能存在有限

7、个,例 如两个或三个,设计并编写代码实现一个多例类。6. 使用单例模式设计一个多文档窗口(注:在Java AWT/Swing开发中可使用JDesktopPane和JinternalFrame来实现),要求在主窗体中某个内部子窗体只能实例化一次, 即只能弹出一个相同的子窗体,如下图所示,编程实现该功能。(注:用C#或C+实现类似功能也可以)7. 现有一个接口 DataOperation 定义了排序方法 sort(int)和查找方法 search(int, int),已知类 Quicksort的quickSort(int)方法实现了快速排序算法,类BinarySearch的 binarySearc

8、h(int, int)方法实现了二分查找算法。试使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到 DataOperation接口中。绘制类图并编程实现。(要求实现快速排序和二分查找,使用对象适配器实现)8. 使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件 VideoFile。绘制类图并编程模拟实现。三、实验要求1. 选择合适的面向对象设计原则对系统进行重构,

9、正确无误地绘制重构之后的类图;2. 结合实例,正确无误地绘制简单工厂模式、工厂方法模式、抽象工厂模式、单例模 式、适配器模式和组合模式的模式结构图;3. 使用任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式和组合模式实例,代码运行正确无误。四、实验步骤1. 选择合适的面向对象设计原则对系统进行重构,使用PowerDesigner绘制重构之后的类图;2. 结合实例,使用PowerDesigner绘制简单工厂模式实例结构图并用面向对象编程语言 实现该模式实例;3. 结合实例,使用PowerDesigner绘制工厂方法模式实例结构图并用面向对象编程语言 实现

10、该模式实例;4. 结合实例,使用PowerDesigner绘制抽象工厂模式实例结构图并用面向对象编程语言 实现该模式实例;5. 结合实例,使用PowerDesigner绘制多例模式实例结构图并用面向对象编程语言实现 该模式实例;6. 结合实例,使用PowerDesigner绘制单例模式实例结构图并用面向对象编程语言实现 该模式实例。7. 结合实例,使用PowerDesigner绘制适配器模式实例结构图并用面向对象编程语言实 现该模式实例;8. 结合实例,使用PowerDesigner绘制组合模式实例结构图并用面向对象编程语言实现 该模式实例。五、实验结果1. 重构之后的类图:*Flgiy?xm

11、l versionffacioryCircieFactcry* inltOiwdd*轻:诃日* milD: vcrid卜 setSize 0 询d* Ml即lay Q : vddfri angle Fa clary+creatEShaffw 0 : Shapeifijerlin-gie Factory+ 0we cnwrtrShapeO : Shape* inle Q:帕Id4*sltolor 0 : voQ nil 0;vult- InftQ : void +leKoiar 0 rvoldt filIQ : vgid + 嘴 vOverrid巴asetire Q : void + i dre

12、ary D : raid* Inh Q ;vold* Q : vgid* * * fill 0: void+ MTSize Q : void4 * display 0 : void重构过程中所使用的面向对象设计原则及简要说明:单一职责原则,使用工厂把类的创建和使用分开。开闭原则,通过抽象工厂和抽象产品类,使得增加新的图形很方便。里氏代换原则,客户端通过抽象工厂类编程,运行时读取配置文件信息, 用具体工厂类覆盖。依赖倒转原则,客户端对抽象工厂类编程而不是具体工厂类编程。迪米特法则,客户端只对三个类进行交互,不管以后增加多少个新的图形。2. 类图: public class ErrorShape

13、implements Shape private String type = nuII;实现代码:-伽HQ 渲1+ Elmplcrt?- draw Q: wild* Q:时1 日令 = Constructor* Erroriiijpe(String msg|SimpitFdcwry| + g049iapa (String:hap*绡血旧咖 argsUR: voidXMUJtilOverridepublic void draw () throws UnSupportedShapeException throw new UnSupportedShapeException(”不支持+type+这种图

14、形);Overridepublic void erase () public ErrorShape(String msg)type =msg ;public class Rect implements Shape Overridepublic void draw () System. out .println(方形绘制”);Overridepublic void erase () System. out .println(方形擦除”);public Rect()System. out .println(方形创建); public class Triangle implements Shape

15、Overridepublic void draw () System. out .println(三角形绘制); Overridepublic void erase () System. out .println(三角形擦除); public Triangle()System. out .println(三角形创建); public class SimpleFactorypublic static Shape getShape (String type) throws UnSupportedShapeException Shape shape= nu II;String stri ng=typ

16、e.toLowerCase() ;switch (string)case circle:shape= new Circle();break;case rectangle:shape= new Rect();break;case triangle:shape= new Triangle();break;default :shape= new ErrorShape(stri ng);break;return shape ;public static void main (String args)try Shape a ;String type=XMLUtil. getShapeType ();a=

17、getShape (type);a.draw();a.erase(); catch (Exception e)e.pri ntStackTrace();public class UnSupportedShapeExceptionextends Exception public UnSupportedShapeException(String msg)super (msg);public class XMLUtil public static String getShapeType () try /创建文档对象Docume ntBuilderFactory builderFactory =3.类

18、图:GifReader+ readlmg (String fiileName) : void + GifReader 0TestD-ReaderFartoryIrrihgiigeRsder+ maiin (String rgsO) : void+ createReadler 0 : ImageReader+ readlmg (String fileName) : voidXMLUtil+ getlmgReadeir 0 : ObjectJ ipg Reader+ ireadlnng (String filename) : void+ pg Reader 0JPGReaderFactoryGIF

19、ReaderFartDiy+ cneateReader Q : ImageReiader召 create Reader Q : ImageReader实现代码:public class GIFReaderFactory implements ReaderFactory Overridepublic ImageReader createReader () /配置环境等比如连接数据库ImageReader reader= new GifReader();/初始化reader的数据等return reader ;public class JPGReaderFactory implements Rea

20、derFactory Overridepublic ImageReader createReader () /配置环境等比如连接数据库ImageReader reader= new JpgReader();/初始化reader的数据等return reader ;public class GifReader implements ImageReader Overridepublic void readImg (String fileName) System. out.println( GIF 图片读取器读取+fileName);public GifReader()public class Jp

21、gReader implements ImageReader Overridepublic void readImg (String fileName) System. out.println( JPG 图片读取器读取+fileName);public JpgReader()public class XMLUtil public static Object getImgReader () try /创建文档对象Docume ntBuilderFactory builderFactory =DocumentBuilderFactory.newlnstanee ();Docume ntBuilde

22、r builder = builderFactory .n ewDocume ntBuilder()Document document = builder.parse( new File( config.xml);NodeList no deList =docume nt.getEleme ntsByTagName(imgReaderFactory);Node node = nodeList.item( O).getFirstChild();10String className = no de.getNodeValue().trim();Class c=Class. forName (clas

23、sName);Object o=c. newln sta nce();return o; catch (Exception e) e.pri ntStackTrace();return nu II;public class Test public static void main (String args)ReaderFactory factory= (ReaderFactory) XMLUtil. getImgReader ();ImageReader reader=factory.createReader() ; reader.readImg( 1.?);4. 类图:XMLUtil+ ge

24、tlmgReader () : Object* Button 0: ButtonClient I1 :* cre-ateTewtReldO : TerHeld# c reais uhekutdng O : ZuhekungSpringSIdinFactQiy+cnea-teButton Q : Button+ createTesctField 0! Textfiefd+ crFateZuhekijang ) : Zuhekuang+ create&utt&n (): Button+ creat#TfKtFleldiO :TextReldSpringTjdFipldiSuimme 祝 uheku

25、nngSummerfiuttonZuhekujinsz TexlFleldSpongButtonSpongButton实现代码:public class Butt on public class TextField 11public class Zuhekuang public in terface SkinF actory Butt on createButt on ();TextField createTextField ();Zuhekuang createZuhekuang ();public class Sprin gButt on exte nds Butt on public c

26、lass SpringTextField extends TextField public class SpringZuhekuang extends Zuhekuang public class SpringSkinFactoryimplements SkinFactory Overridepublic Butt on createButt on () return new SpringButton();Overridepublic TextField createTextField () return new SpringTextField();Overridepublic Zuhekua

27、ng createZuhekuang () return new SpringZuhekuang();public class SummerButt on exte nds Butt on public class SummerTextField extends TextField public class SummerZuhekuangextends Zuhekuang public class SummerSkinFactoryimplements SkinFactory Overridepublic Butt on createButt on () return new SummerBu

28、tton();Override125. 类图:duclisJDuoli-INSTANCE NUMBER : int-count-: int= INSTANCE_NUMBER - 1-duolis: Duali| = new DuolilNSTANCE NUMBER-_STATICNITIALIZER0 :d- Duoli 0-getlnstance Q: Duoli+min (String arqQ): void实现代码:13输出加载Duoli这个类了new Duoli() 了new Duoli() 了new Duoli() 了desig nPattern.Duoli.Duoli14ae5a5

29、14desig nPattern.Duoli.Duoli7f31245adesig nPattern.Duoli.Duoli6d6f6e28desig nPattern.Duoli.Duoli14ae5a56. 类图:MyJ Interna I Fra meMyJFrameJB Litton : JButton MyJ Fra me Qmain (String argsQ) : void MyJIntemalFrame 0- MyJInternalFrame (String titl氏 boolean resize boolean close)+getlntance O: MyJlntemal

30、Frame目 HaldeirClassMyJlnternalFrame;7Ha IderClas-inBai 门氓 :iVly川 ntEmalFr 日 mtE hew MyJ Interna I Fra me-Ctt/.tru 启也叮已)实现代码:157.类图:16IpaDataQperatlcn+ tort (Int airJ): boolin+ search (int arrQ, int a) : boolean实现代码:public in terface DataOperati on boolean sort(int arr);boolean search (int arr, int a

31、);public class BinarySearch public static booleanbinarySearch (int arr, int a) return true;public class QuickSort public static booleanquicksort (int a) return true;public class DoAdapter implements DataOperation private QuickSort quickSort ;private BinarySearch binarySearch ;public DoAdapter()quick

32、Sort =new Quicksort。;binarySearch =new BinarySearch();Overridepublic boolean sort (int arr) 17return quicksort .quicksort (arr);Overridepublic boolean search (int arr, int a) return binarySearch .binarySearch (arr ,a);8.类图:实现代码:public abstract class AbstractFile private Stri ng file name ;public Str

33、ing getFilename () return file name ;public void setFile name (Stri ng file name) this .file name = file name ;public AbstractFile(String filename) setFile name(file name);public abstract void killVirus ();public abstract class File extends AbstractFile 18 public File(Stri ng file name) super (filen

34、ame);public class Folder extends AbstractFile private LinkedListfiles = new LinkedList();public Folder(Stri ng file name) super (filename);public void add (AbstractFile file)files .add(file);private void killFiles ()for (AbstractFile file: files)file.killVirus();Overridepublic void killVirus () Syst

35、em. out.println(对文件夹+super .getFilename()+ 下的文件进行杀毒 ); killFiles();public class ImageFile extends File public ImageFile(Stri ng file name) super (filename);Overridepublic void killVirus () System. out.println(对图片文件+super .getFilename()+ 进行杀毒);public class TextFile extends File public TextFile(Stri n

36、g file name) super (filename);Overridepublic void killVirus () System. out.println(对文本文件+super .getFilename()+ 进行杀毒);19public class VideoFile extends File public VideoFile(Stri ng file name) super (filename);Override进行杀毒);public void killVirus () System. out.println(对视频文件+super .getFilename()+ publi

37、c class Client public static void main (String args) AbstractFile a =AbstractFile a1 =new Folder(软件体系结构nevv Folder(实验二);AbstractFile b =newTextFile( 1.txt);AbstractFile c =newImageFile( 2.jpg);AbstractFile d =newVideoFile( 3.rmvb);(Folder) a).add(a1);(Folder) a1).add(b);d.killVirus();a.killVirus();c.killVirus();打印对视频文件3.rmvb进行杀毒对文件夹软件体系结构下的文件进行杀毒对文件夹实验二下的文件进行杀毒对文本文件1.txt进行杀毒对图片文件2.jpg进行杀毒六、实验小结20

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1