设计模式课程设计蔡勇.docx

上传人:b****7 文档编号:25117979 上传时间:2023-06-05 格式:DOCX 页数:12 大小:144.07KB
下载 相关 举报
设计模式课程设计蔡勇.docx_第1页
第1页 / 共12页
设计模式课程设计蔡勇.docx_第2页
第2页 / 共12页
设计模式课程设计蔡勇.docx_第3页
第3页 / 共12页
设计模式课程设计蔡勇.docx_第4页
第4页 / 共12页
设计模式课程设计蔡勇.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

设计模式课程设计蔡勇.docx

《设计模式课程设计蔡勇.docx》由会员分享,可在线阅读,更多相关《设计模式课程设计蔡勇.docx(12页珍藏版)》请在冰豆网上搜索。

设计模式课程设计蔡勇.docx

设计模式课程设计蔡勇

 

西南交通大学

课程设计报告

 

设计模式

 

题目:

绘图软件的设计与实现

姓名:

王强

学号:

2014210493

专业:

软件工程

Email:

 

2015年6月

 

1.需求分析

使用JAVA语言开发绘图软件,本绘图软件应具备对直线、矩形、圆形等最基本图形的绘制功能,此外,还可以对绘制的图形进行一些操作,如选中图形、移动已经选中的图形、对已经选中的多个图形进行组合、对选中的已经组合的图形进行拆分、改变选中图形的颜色、删除已经选中的图形等。

采用面向对象的思想开发本画图软件,为了可重用代码、让代码更容易被他人理解、保证代码可靠性,使用设计模式。

在系统中,涉及三大类模式:

创建型模式、结构型模式和行为型模式。

2.系统设计

2.1设计框架

在设计java绘图软件时,主要包含了绘图界面的实现和绘图实现,两大主要任务。

在实现上,对于绘图界面的实现,采用改了javafxRIA开发,将界面用Main.fxml文件定义,然后通过MainController实现界面初始化及按键方法。

对于绘图的实现,采用改了继承在jfxrt包下的各种图形类及javafx.Application类。

Jfxrt包下有各种图形的实现及扩展。

在最后,将所编写代码,重构为带有设计模式的代码,使所做的软件具有更好的扩展性,职责明确,便于修改。

2.2部分重要UML图展示

 

图1适配器对象及其接口图

 

图2命令者对象继承图

 

图3画图对象继承图图4中介者对象继承图

 

 

图5事件处理继承图

 

 

图6图形类继承图

2.3类的定义

CollegueAdapter:

这个类是用来适应JavaFX组件原型Cacha类。

它是适配器模式的一部分。

GenericAdapter:

该接口描述了一个通用的适配器。

一切对象都可以被代理。

Command:

这个command接口,为命令模式向上的命令接口。

GroupCommand、ShapeCommand、UngroupCommand:

这三个类用于组图形和解组状态以及绘制图形。

AbstractShapeObjectMouseEvent:

这个类描述了鼠标事件。

在使用的时,它必须是在形状对象执行类的一个成员。

CircleObjectMouseEventHandler、EllipseObjectMouseEventHandler、GroupObjectMouseEventHandler、PathObjectMouseEventHandler、PolygonObjectMouseeventHandler:

这五个类都继承与AbstractShapeObjectMouseEvent这个鼠标事件类,用于定义各自图形鼠标事件的实现。

MainController:

这个类实现自Initializable接口,用于初始化界面,及实现界面按钮方法。

Mediator:

这个接口是用来描述任何可能的调解类的调解模式。

Collegue:

这个接口应该被用来定义在中介模式的同事接口。

Cache:

这个类是用来通过请求克隆原型对象。

它是一个线程安全Singleton。

用来得到的原型,getShape()方法使用通过给枚举类型,以指示正确的形状。

它是在调解模式的中介作用。

CircleObject、EllipaseObject、GroupObject、PathObject、RectangleObject、SqurareObjecct、TriangleObject:

这几个类都是图形类,都继承与其上层图形类,也实现了ShapeObject接口。

Main:

继承自Application类,用来启动java软件。

3系统实现

3.1主界面展示

主界面布局的代码在main.fxml中,定义了主界面的布局,界面加载代码:

publicvoidstart(finalStageprimaryStage)

{

try

{

//LoadFXML

finalParentroot=FXMLLoader.load(getClass().getResource("/at/fh/swp/graphicseditor/gui/Main.fxml"));

Scenescene=newScene(root);

scene.getStylesheets().add("/at/fh/swp/graphicseditor/gui/Main.css");

primaryStage.setTitle("GraphicsEditor");

primaryStage.setScene(scene);

primaryStage.setResizable(false);

primaryStage.show();

}

catch(IOExceptione)

{

e.printStackTrace();

}

}

 

 

按钮的实现在MainController中,以Circle代码为例:

id="btnCircle"font="$x2"mnemonicParsing="false"onAction="#onCircle"prefWidth="100.0"text="Circle">

3.2点击绘图

实现点击绘图的代码:

@FXML

publicvoidonCircle(ActionEventevent)

{

intid=ShapeTypes.CIRCLE_ID;

CommandshapeCmd=newShapeCommand(this.editorPane,Cache.getInstance().getShape(id));

History.getInstance().execute(shapeCmd);

}

@Override

publicvoiddraw(Panetarget,Objectn)

{

if(ninstanceofNode)

{

target.getChildren().add((Node)n);

System.out.println("Draw"+target.getChildren());

}

elsethrownewIllegalArgumentException();

}

Ps:

这里用到了命令模式,主要实现了client与具体实现者的解耦,所有的命令有Invoker发出。

3.3事件处理

实现事件处理的代码:

(点击事件与拖拽为例)

publicvoidhandle(MouseEventevent)

{

if(event.getEventType()==MouseEvent.MOUSE_CLICKED)

{

if(event.isShiftDown())

{

if(Grouper.getInstance().contains(this.m_internalEventBound))

{

Grouper.getInstance().remove((ShapeObject

?

>)event.getSource());

}

else

{

Grouper.getInstance().add((ShapeObject

?

>)event.getSource());

}elseif(event.getEventType()==MouseEvent.MOUSE_DRAGGED)

{

//SetnewlayoutXandYvaluesforpolygon

this.m_internalEventBound.setLayoutX(event.getSceneX()+this.m_deltaPoly.getX());

this.m_internalEventBound.setLayoutY(event.getSceneY()+this.m_deltaPoly.getY());

}

}

3.4获取图形

获取图形实例代码:

publicstaticCachegetInstance()

{

if(Cache.m_instance==null)

{

synchronized(Cache.class)

{

if(Cache.m_instance==null)

{

Cache.m_instance=newCache();

}

}

}

returnCache.m_instance;

}

Ps:

这里用到了单例模式。

3.5撤销与恢复操作

撤销与恢复操作代码:

publicvoidundo()

{

if(!

m_undos.isEmpty())

{

Commandcmd=m_undos.pop();

cmd.undo();

m_redos.push(cmd);

}

elseSystem.out.println("Nothingtoundo.");

}

publicvoidredo()

{

if(!

m_redos.isEmpty())

{

Commandcmd=m_redos.pop();

cmd.redo();

m_undos.push(cmd);

}

elseSystem.out.println("Nothingtoredo.");

}

4测试

对画图软件进行功能测试,对于绘制基本图形的绘画,以及对于填充颜色,边框颜色没有问题。

对于拖拽功能、点选,以及撤销和恢复功能的操作也没有问题。

 

5总结

本软件的设计初衷,是为了学习设计模式,在本软件的设计中,其实用到了六种模式:

单例模式,命令者模式,代理模式,原型模式,中介者模式及组合模式,用心观察才能体会到其中的作用。

这使本软件具备了更好的扩展性。

当然也是为了学习javafx对于RIA程序的编写。

本软件还存在一些问题,例如,不能持久化等。

有待后续填补。

 

参考文献

[1]BruceEckel.ThinkinginJava[M].UpperSaddleRiver,NewJersey,USA:

PrenticeHall,2006

[2]Eric.Java编程思想[M].第4版.机械工业出版社,2007年6月.

[3]MetskerSJ.Java设计模式[M].第2版.电子工业出版社,2012年9月.

[4]刘德山.Java设计模式深入研究[M].人民邮电出版社,2014年7月.

[5][美]ErichGamma.DesignPatterns:

ElementsofReusableObject-OrientedSoftware[M].机械工业出版社,2000年9月.

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

当前位置:首页 > 党团工作 > 思想汇报心得体会

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

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