设计模式课程设计Word格式文档下载.docx
《设计模式课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《设计模式课程设计Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
![设计模式课程设计Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/16/05aee334-0c79-481b-99db-9a98d33e581c/05aee334-0c79-481b-99db-9a98d33e581c1.gif)
2.3类的定义4...
3系统实现5...
3.1主界面展示5..
3.2点击绘图7...
3.3事件处理8...
3.4获取图形9...
3.5撤销与恢复操作1..0
4测试1..1.
5总结1..1.
1.需求分析
使用JAVA语言开发绘图软件,本绘图软件应具备对直线、矩形、圆形等最基本图形的绘制功能,此外,还可以对绘制的图形进行一些操作,如选中图形、移动已经选中的图形、对已经选中的多个图形进行组合、对选中的已经组合的图形进行拆分、改变选中图形的颜色、删除已经选中的图形等。
采用面向对象的思想开发本画图软件,为了可重用代码、让代码更容易被他人理解、保证代码可靠性,使用设计模式。
在系统中,涉及三大类模式:
创建型模式、结构型模式和行为型模式。
2.系统设计
2.1设计框架
在设计java绘图软件时,主要包含了绘图界面的实现和绘图实现,两大主要任务。
在实现上,对于绘图界面的实现,采用改了javafxRIA开发,将界面用
Main.fxml文件定义,然后通过MainController实现界面初始化及按键方法。
对于绘图的实现,采用改了继承在jfxrt包下的各种图形类及javafx.Application类0Jfxrt包下有各种图形的实现及扩展。
在最后,将所编写代码,重构为带有设计模式的代码,使所做的软件具有更好的扩展性,职责明确,便于修改。
2.2部分重要UML图展示
图1适配器对象及其接口图
<
lnterfaa、
Command
ShapeCommand
UngroupCommand
GroupComniand
A
^execii&
Q
■^undoQ
*reda()
图2命令者对象继承图
EvL!
iilHaniJle,
I
图5事件处理继承图
图6图形类继承图
2.3类的定义
CollegueAdapter:
这个类是用来适应JavaFX组件原型Cacha类。
它是适配器模式的一部分。
GenericAdapter:
该接口描述了一个通用的适配器。
一切对象都可以被代理。
Command这个comma接口,为命令模式向上的命令接口。
GroupComman、dShapeComman、dUngroupCommand:
这三个类用于组图形和解组状态以及绘制图形。
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
{
//LoadFXMLfinalParentroot=
"
/at/fh/swp/graphicseditor/gui/Main.
FXMLLoader.load(getClass().getResource(fxml"
));
Scenescene=newScene(root);
}
catch
e.printStackTrace();
按钮的实现在MainController中,以Circle代码为例:
vButtonfx:
id="
btnCircle"
font="
$x2"
mnemonicParsing="
false"
onAction="
#onCircle"
prefWidth="
100.0"
text="
Circle"
>
tooltip>
TooltipprefWidth="
150.0"
Drawacircleintheeditor"
textAlignment="
JUSTIFY"
wrapText="
true"
/>
v/tooltip>
/Button>
3.2点击绘图
实现点击绘图的代码:
@FXML
publicvoidonCircle(ActionEventevent)
intid=ShapeTypes.CIRCLE_ID;
CommandshapeCmd=newShapeCommand(this.editorPane
Cache.getInstanee().getShape(id));
History.getInstanee().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<
}elseif(event.getEventType()==MouseEvent.MOUSE_DRAGGE)D{
//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)
Cache.m_instance=newCache();
returnCache.m_instance;
这里用到了单例模式。
3.5撤销与恢复操作
撤销与恢复操作代码:
publicvoidundo()
if(!
m_undos.isEmpty())
Commandcmd=m_undos.pop();
cmd.undo();
m_redos.push(cmd);
elseSystem.out.println("
Nothingtoundo."
);
publicvoidredo()
m_redos.isEmpty())
Commandcmd=m_redos.pop();
cmd.redo();
m_undos.push(cmd);
Nothingtoredo."
4测试
对画图软件进行功能测试,对于绘制基本图形的绘画,以及对于填充颜色,边框颜色没有问题。
对于拖拽功能、点选,以及撤销和恢复功能的操作也没有问题。
5总结
本软件的设计初衷,是为了学习设计模式,在本软件的设计中,其实用到了六种模式:
单例模式,命令者模式,代理模式,原型模式,中介者模式及组合模式,用心观察才能体会到其中的作用。
这使本软件具备了更好的扩展性。
当然也是为了学习javafx对于RIA程序的编写。
本软件还存在一些问题,例如,不能持久化等。
有待后续填补。
参考文献
[1]BruceEckel.ThinkinginJava[M].UpperSaddleRiver,NewJersey,USA:
PrenticeHall,2006
[2]Eric.Java编程思想[M].第4版.机械工业出版社,2007年6月.
[3]MetskerSJ.Jave设计模式[M].第2版.电子工业出版社,2012年9月.
[4]刘德山.Java设计模式深入研究[M].人民邮电出版社,2014年7月.
[5][美]ErichGamm