版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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<
11、;?xml version®<5hapeType? tiiangle/shawT ypc >ffacioryCircieFactcry* inltOiwdd*轻:诃日* milD: vcrid卜 setSize 0 询d* Ml即lay Q : vddfri angle Fa clary+creatEShaffw 0 : Shapeifijerlin-gie Factory+ < <0we<ride* > cnwrtrShapeO : Shape* <<Oerrikle>>inle Q:帕Id4<<CHAerrk
12、Se>*sltolor 0 : voQ nil 0;vul't- <Q : toI-4: vdiTriangle+ «Own1de*> InftQ : void +leKoiar 0 rvoldt <*Ovcmde>> filIQ : vgid + 嘴 vOverrid巴a"setire Q : void + «<Owerride>i dreary D : raid* <<O¥errk*e>> Inh Q ;vold* <<QvprrKi?>>Q :
13、vgid* * <Qvefride:>* fill 0: void+ <«Overrkle>> MTSize Q : void4 *<OMerrkle>> display 0 : void重构过程中所使用的面向对象设计原则及简要说明:单一职责原则,使用工厂把类的创建和使用分开。开闭原则,通过抽象工厂和抽象产品类,使得增加新的图形很方便。里氏代换原则,客户端通过抽象工厂类编程,运行时读取配置文件信息, 用具体工厂类覆盖。依赖倒转原则,客户端对抽象工厂类编程而不是具体工厂类编程。迪米特法则,客户端只对三个类进行交互,不管以后增加多少个新的图
14、形。2. 类图: public class ErrorShape implements Shape private String type = nuII;实现代码:-伽HQ "渲1+ E«lmplcr¥t?-> draw Q: wild* <<lmp4eiTwnit>>Q:时1 日令 = Constructor*> Erroriiijpe(String msg|SimpitFdcwry| + g049iapa (String:£hap»*绡血旧咖 argsUR: voidXMUJtilOverridepubl
15、ic void draw () throws UnSupportedShapeException throw new UnSupportedShapeException(”不支持"+type+"这种图形");Overridepublic void erase () public ErrorShape(String msg)type =msg ;public class Rect implements Shape Overridepublic void draw () System. out .println("方形绘制”);Overridepublic
16、void erase () System. out .println("方形擦除”);public Rect()System. out .println("方形创建"); public class Triangle implements Shape Overridepublic void draw () System. out .println("三角形绘制"); Overridepublic void erase () System. out .println("三角形擦除"); public Triangle()Syst
17、em. out .println("三角形创建"); public class SimpleFactorypublic static Shape getShape (String type) throws UnSupportedShapeException Shape shape= nu II;String stri ng=type.toLowerCase() ;switch (string)case "circle":shape= new Circle();break;case "rectangle":shape= new Rect
18、();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=getShape (type);a.draw();a.erase(); catch (Exception e)e.pri ntStackTrace();public class
19、 UnSupportedShapeExceptionextends Exception public UnSupportedShapeException(String msg)super (msg);public class XMLUtil public static String getShapeType () try /创建文档对象Docume ntBuilderFactory builderFactory =3.类图:GifReader+ <<lmplement>> readlmg (String fiileName) : void + <<Const
20、ructor>> GifReader 0TestD-ReaderFartoryIrrihgiigeRsder+ maiin (String rgsO) : void+ createReadler 0 : ImageReader+ readlmg (String fileName) : voidXMLUtil+ getlmgReadeir 0 : ObjectJ ipg Reader+ <<lmplement>> ireadlnng (String filename) : void+ <<Constructor>> pg Reader
21、0JPGReaderFactoryGIFReaderFartDiy+ <<)mplement>> cneateReader Q : ImageReiader召 <<lrnplennerit >> create Reader Q : ImageReader实现代码:public class GIFReaderFactory implements ReaderFactory Overridepublic ImageReader createReader () /配置环境等比如连接数据库ImageReader reader= new GifReader
22、();/初始化reader的数据等return reader ;public class JPGReaderFactory implements ReaderFactory Overridepublic ImageReader createReader () /配置环境等比如连接数据库ImageReader reader= new JpgReader();/初始化reader的数据等return reader ;public class GifReader implements ImageReader Overridepublic void readImg (String fileName)
23、System. out.println( "GIF 图片读取器读取"+fileName);public GifReader()public class JpgReader implements ImageReader Overridepublic void readImg (String fileName) System. out.println( "JPG 图片读取器读取"+fileName);public JpgReader()public class XMLUtil public static Object getImgReader () try
24、/创建文档对象Docume ntBuilderFactory builderFactory =DocumentBuilderFactory.newlnstanee ();Docume ntBuilder builder = builderFactory .n ewDocume ntBuilder()Document document = builder.parse( new File( "config.xml");NodeList no deList =docume nt.getEleme ntsByTagName("imgReaderFactory")
25、;Node node = nodeList.item( O).getFirstChild();10String className = no de.getNodeValue().trim();Class c=Class. forName (className);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=
26、 (ReaderFactory) XMLUtil. getImgReader ();ImageReader reader=factory.createReader() ; reader.readImg( "1.?");4. 类图:XMLUtil+ getlmgReader () : Object* Button 0: ButtonClient I1 :* cre-ateTewtReldO : TerHeld# c reais uhekutdng O : ZuhekungSpringSIdinFactQiy+cnea-teButton Q : Button+ <<
27、lm(3lerTwnt> createTesctField 0! Textfiefd+ <<lrinpleint!>> crFateZuhekijang ) : Zuhekuang+ <<lmplenwnit>> create&utt&n (): Button+ <simple-nwnt>> creat#TfKtFleldiO :TextReldSpringTjdFipldiSuimme 祝 uhekunngSummerfiuttonZuhekujinsz TexlFleldSpongButtonSpong
28、Button实现代码: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 class SpringTextField extends TextField public class S
29、pringZuhekuang extends Zuhekuang public class SpringSkinFactoryimplements SkinFactory Overridepublic Butt on createButt on () return new SpringButton();Overridepublic TextField createTextField () return new SpringTextField();Overridepublic Zuhekuang createZuhekuang () return new SpringZuhekuang();pu
30、blic 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 SummerButton();Override125. 类图:duclisJDuoli-INSTANCE NUMBER :
31、 int-count-: int= INSTANCE_NUMBER - 1-duolis: Duali| = new DuolilNSTANCE NUMBER-<<statklnitializer>>_STATICNITIALIZER0 :d-<<Constructor> >Duoli 0-getlnstance Q: Duoli+min (String arqQ): void实现代码:13输出加载Duoli这个类了new Duoli() 了new Duoli() 了new Duoli() 了desig nPattern.Duoli.Duoli1
32、4ae5a514desig nPattern.Duoli.Duoli7f31245adesig nPattern.Duoli.Duoli6d6f6e28desig nPattern.Duoli.Duoli14ae5a56. 类图:MyJ Interna I Fra meMyJFrameJB Litton : JButton< c 匚onstru ctor> > MyJ Fra me Qmain (String argsQ) : void <<Con$tructor>> MyJIntemalFrame 0-<<Constfuctor>
33、MyJInternalFrame (String titl氏 boolean resize boolean close)+getlntance O': MyJlntemalFrame目 HaldeirClassMyJlnternalFrame;7Ha IderClas-inBai 门氓 :iVly川 ntEmalFr 日 mtE hew MyJ Interna I Fra me-C"tt/.tru 启也叮已)实现代码:157.类图:16IpaDataQperatlcn+ tort (Int airJ): bool«in+ search (int arrQ, int
34、a) : boolean实现代码:public in terface DataOperati on boolean sort(int arr);boolean search (int arr, int a);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
35、 DataOperation private QuickSort quickSort ;private BinarySearch binarySearch ;public DoAdapter()quickSort =new Quicksort。;binarySearch =new BinarySearch();Overridepublic boolean sort (int arr) 17return quicksort .quicksort (arr);Overridepublic boolean search (int arr, int a) return binarySearch .bi
36、narySearch (arr ,a);8.类图:实现代码:public abstract class AbstractFile private Stri ng file name ;public String 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 killV
37、irus ();public abstract class File extends AbstractFile 18 public File(Stri ng file name) super (filename);public class Folder extends AbstractFile private LinkedList<AbstractFile>files = new LinkedList<>();public Folder(Stri ng file name) super (filename);public void add (AbstractFile file)files .add(file);private void killFile
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论