整理中南大学设计模式实验2.docx
《整理中南大学设计模式实验2.docx》由会员分享,可在线阅读,更多相关《整理中南大学设计模式实验2.docx(42页珍藏版)》请在冰豆网上搜索。
整理中南大学设计模式实验2
中南大学设计模式实验2
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(中南大学设计模式实验2)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为中南大学设计模式实验2的全部内容。
《软件体系结构》
实验报告
项目名称设计模式实验二
专业班级软件1501
学号
姓名
实验成绩:
批阅教师:
2017年12月12日
实验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.在某RPG游戏中使用简单工厂模式创建游戏角色,该游戏可根据用户所选择的参数来创建不同的角色(Role),例如参数为“angel”时创建一个天使角色,参数为“hero”时创建一个英雄角色,参数为“witch”时创建一个女巫角色。
绘制类图并使用Java语言编程模拟实现.
3.现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。
图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。
使用工厂方法模式设计该程序,绘制类图并编程模拟实现。
需充分考虑系统的灵活性和可扩展性。
4.某系统为了改进数据库操作的性能,用户可以自定义数据库连接对象Connection和语句对象Statement,针对不同类型的数据库提供不同的连接对象和语句对象,例如提供Oracle或MySQL专用连接类和语句类,而且用户可以通过配置文件等方式根据实际需要动态更换系统数据库。
使用抽象工厂模式设计该系统,要求绘制对应的类图并使用Java语言编程模拟实现.
5.使用单例模式的思想实现多例模式(Multiton),确保系统中某个类的对象只能存在有限个,例如两个或三个,设计并编写代码实现一个多例类。
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。
空客(Airbus)、波音(Boeing)和麦道(McDonnell-Douglas)都是飞机制造商,它们都生产载客飞机(PassengerPlane)和载货飞机(CargoPlane)。
现需要设计一个系统,描述这些飞机制造商以及它们所制造的飞机种类。
绘制类图并编程模拟实现。
9.某移动社交软件欲增加一个群组(Group)功能。
通过设置,用户可以将自己的动态信息,包括最新动态、新上传的视频以及分享的链接等,分享给某个特定的成员(Member),也可以分享给某个群组中的所有成员;用户可以将成员添加至某个指定的群组;此外,还允许用户在一个群组中添加子群组,以便更加灵活地实现面向特定人群的信息共享.
选择一种合适的设计模式来设计该群组功能,要求给出该模式的名称及定义,结合场景绘制相应的结构图并编程模拟实现(类名、方法名和属性名可自行定义)。
10。
某教育机构组织结构如下图所示:
在该教育机构的OA系统中可以给各级办公室下发公文,试采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文.
三、实验要求
1。
选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图;
2。
结合实例,正确无误地绘制简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、桥接模式和组合模式的模式结构图;
3。
使用任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、桥接模式和组合模式实例,代码运行正确无误。
四、实验步骤
1。
选择合适的面向对象设计原则对系统进行重构,使用PowerDesigner绘制重构之后的类图;
2。
结合实例,使用PowerDesigner绘制简单工厂模式实例结构图并用面向对象编程语言实现该模式实例;
3。
结合实例,使用PowerDesigner绘制工厂方法模式实例结构图并用面向对象编程语言实现该模式实例;
4。
结合实例,使用PowerDesigner绘制抽象工厂模式实例结构图并用面向对象编程语言实现该模式实例;
5。
结合实例,使用PowerDesigner绘制多例模式实例结构图并用面向对象编程语言实现该模式实例;
6.结合实例,使用PowerDesigner绘制单例模式实例结构图并用面向对象编程语言实现该模式实例。
7。
结合实例,使用PowerDesigner绘制适配器模式实例结构图并用面向对象编程语言实现该模式实例;
8。
结合实例,使用PowerDesigner绘制桥接模式实例结构图并用面向对象编程语言实现该模式实例;
9。
结合实例,使用PowerDesigner绘制组合模式实例结构图并用面向对象编程语言实现该模式实例。
五、实验结果
1。
重构之后的类图:
重构过程中所使用的面向对象设计原则及简要说明:
根据题意采用了工厂方法模式,所谓工厂模式则是定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到子类。
使用了开闭原则,单一职责原则。
2.类图:
实现代码:
//代码颜色使用黑色,字体使用TimesNewRoman或Arial,字号为五号,如
Role类:
publicabstractclassRole{
publicabstractvoiddisplay();
}
Angle类:
publicclassAngleextendsRole{
publicAngle(){}
publicvoiddisplay(){
System。
out。
println("angle”);
}
}
Hero类:
publicclassHeroextendsRole{
publicHero(){}
publicvoiddisplay(){
System。
out.println("hero");
}
}
Witch类:
publicclassWitchextendsRole{
publicWitch(){}
publicvoiddisplay(){
System。
out。
println(”witch");
}
}
RoleFactory类:
publicclassRoleFactory{
publicstaticRolegetRole(Stringtype){
Rolerole=null;
if(type.equalsIgnoreCase("angle")){
role=newAngle();
}
if(type。
equalsIgnoreCase(”witch")){
role=newWitch();
}
if(type.equalsIgnoreCase("Hero")){
role=newHero();
}
returnrole;
}
}
Main类(客户端):
publicclassMain{
publicstaticvoidmain(String[]args){
Rolerole;
role=RoleFactory。
getRole(”hero");
if(role==null){
System。
out。
println(”创建角色失败..。
请检查参数");
}else{
role。
display();
}
//System。
out。
println(”HelloWorld!
");
}
}
3.类图:
实现代码:
ImageReadeFactary类:
publicabstractclassImageReaderFactory{
publicabstractImageReadercreateImageReadeer();
}
GifReaderFactory类:
publicclassGifReaderFactoryextendsImageReaderFactory{
publicImageReadercreateImageReadeer(){
GifReadergifReader=newGifReader();
returngifReader;
}
}
JpgReaderFactory类:
publicclassJpgReaderFactoryextendsImageReaderFactory{
publicImageReadercreateImageReadeer(){
JpgReaderjpgReader=newJpgReader();
returnjpgReader;
}
}
ImageReader类:
publicabstractclassImageReader{
publicvoidreadImage(){}
}
GifReader类:
publicclassGifReaderextendsImageReader{
publicvoidreadImage(){
System.out。
println(”通过GifReader读取图片”);
}
}
JpgReader类:
publicclassJpgReaderextendsImageReader{
publicvoidreadImage(){
System.out。
println(”通过JpgReader读取图片");
}
}
XMLUtil类:
importorg.w3c.dom.Document;
importorg。
w3c.dom.Node;
importorg。
w3c。
dom.NodeList;
importjavax。
xml.parsers.DocumentBuilder;
importjavax。
xml.parsers.DocumentBuilderFactory;
importjava.io。
File;
publicclassXMLUtil{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
publicstaticObjectgetBean()throwsException{
//创建DOM文档对象
DocumentBuilderFactorydocumentBuilderFactory=DocumentBuilderFactory。
newInstance();
DocumentBuilderdocumentBuilder=documentBuilderFactory。
newDocumentBuilder();
Documentdocument;
document=documentBuilder.parse(newFile(”config。
xml”));
//获取包含类名的文本结点
NodeListnodeList=document。
getElementsByTagName(”imageType");
NodeimageTypeNode=nodeList。
item(0).getFirstChild();
StringimageType=imageTypeNode.getNodeValue()。
trim();
//通过类名生成实例对象并将其返回
Classclazz=Class.forName(imageType+"ReaderFactory”);
Objectobject=clazz。
newInstance();
returnobject;
}
}
Main类(客户端):
publicclassMain{
publicstaticvoidmain(String[]args){
ImageReaderFactoryimageReaderFactory=null;
ImageReaderimageReader;
try{
imageReaderFactory=(ImageReaderFactory)XMLUtil。
getBean();
}catch(Exceptione){
e。
printStackTrace();
}
imageReader=imageReaderFactory.createImageReadeer();
imageReader。
readImage();
}
}
4.类图:
实现代码:
抽象工厂databaseFactory类:
publicabstractclassdatabaseFactory{
publicabstractConnectioncreateConnection();
publicabstractStatementcreateStatement();
}
具体工厂MysqlFactory类:
publicclassMysqlFactoryextendsdatabaseFactory{
@Override
publicConnectioncreateConnection(){
returnnewmysqlConnection();
}
@Override
publicStatementcreateStatement(){
returnnewmysqlStatement();
}
}
具体工厂OracleFactory类:
publicclassOracleFactoryextendsdatabaseFactory{
@Override
publicConnectioncreateConnection(){
returnneworacleConnection();
}
@Override
publicStatementcreateStatement(){
returnneworacleStatement();
}
}
抽象产品Connection类:
publicclassConnection{
publicvoidconnection(){}
}
抽象产品Statement类:
publicclassStatement{
publicvoidsattement(){}
}
具体产品mysqlConnection类:
publicclassmysqlConnectionextendsConnection{
publicvoidconnection(){
System。
out.println("提供MySql连接对象”);
}
}
具体产品mysqlStatement类:
publicclassmysqlStatementextendsStatement{
publicvoidsattement(){
System.out.println("提供mysql语句对象");
}
}
具体产品oracleConnection类:
publicclassoracleConnectionextendsConnection{
publicvoidconnection(){
System.out.println("提供oracle连接对象");
}
}
具体产品oracleStatement类:
publicclassoracleStatementextendsStatement{
publicvoidsattement(){
System.out.println(”提供oracle语句对象”);
工具类XMLUtil:
importorg.w3c。
dom.Document;
importorg。
w3c。
dom。
Node;
importorg。
w3c.dom.NodeList;
importjavax.xml.parsers.DocumentBuilder;
importjavax。
xml。
parsers。
DocumentBuilderFactory;
importjava.io。
File;
publicclassXMLUtil{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
publicstaticObjectgetBean()throwsException{
//创建DOM文档对象
DocumentBuilderFactorydocumentBuilderFactory=DocumentBuilderFactory。
newInstance();
DocumentBuilderdocumentBuilder=documentBuilderFactory.newDocumentBuilder();
Documentdocument;
document=documentBuilder。
parse(newFile("config。
xml”));
//获取包含类名的文本结点
NodeListnodeList=document.getElementsByTagName(”databaseType");
NodedatabaseTypeNode=nodeList。
item(0).getFirstChild();
StringdatabaseType=databaseTypeNode.getNodeValue().trim();
//通过类名生成实例对象并将其返回
Classclazz=Class。
forName(databaseType+"Factory”);
Objectobject=clazz。
newInstance();
returnobject;
}
}
客户端Main类:
publicclassMain{
publicstaticvoidmain(String[]args){
databaseFactorydaFactory=null;
Connectionconnection;
Statementstatement;
try{
daFactory=(databaseFactory)XMLUtil.getBean();
}catch(Exceptione){
e.printStackTrace();
}
if(daFactory==null){
System。
out.println("未获取到对象”);
}else{
connection=daFactory。
createConnection();
statement=daFactory.createStatement();
connection.connection();
statement.sattement();
}
}
}
5。
类图:
实现代码:
单例类Multiton:
packageSingleton;
importjava。
util.*;
publicclassMultiton{
//两个或者三个
privatestaticArrayListmultitonList=newArrayList<>();
privatefinalstaticintNUMBER=3;
private