《设计模式》课程设计+2014210584+蔡勇

  • 格式:docx
  • 大小:146.97 KB
  • 文档页数:11

西南交通大学课程设计报告设计模式题目:绘图软件的设计与实现姓名:**学号: ********** 专业:软件工程Email:****************2015年6月目录设计模式 (1)目录 (2)1. 需求分析 (1)2. 系统设计 (1)2.1 设计框架 (1)2.2 部分重要UML图展示 (1)2.3 类的定义 (3)3 系统实现 (4)3.1 主界面展示 (4)3.2 点击绘图 (5)3.3 事件处理 (6)3.4 获取图形 (7)3.5 撤销与恢复操作 (7)4 测试 (8)5 总结 (9)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中,定义了主界面的布局,界面加载代码:public void start(final Stage primaryStage){try{// Load FXMLfinal Parent root =FXMLLoader.load(getClass().getResource("/at/fh/swp/graphicseditor/gui/Main. fxml"));Scene scene = new Scene(root);s cene.getStylesheets().add("/at/fh/swp/graphicseditor/gui/Main.css");primaryStage.setTitle("Graphics Editor");primaryStage.setScene(scene);primaryStage.setResizable(false);primaryStage.show();}catch (IOException e){e.printStackTrace();}}按钮的实现在MainController中,以Circle代码为例:<Button fx:id="btnCircle" font="$x2" mnemonicParsing="false" onAction="#onCircle" prefWidth="100.0" text="Circle"><tooltip><Tooltip prefWidth="150.0" text="Draw a circle in the editor" textAlignment="JUSTIFY" wrapText="true" /></tooltip></Button>3.2 点击绘图实现点击绘图的代码:@FXMLp ublic void onCircle(ActionEvent event){int id = ShapeTypes.CIRCLE_ID;Command shapeCmd = new ShapeCommand(this.editorPane,Cache.getInstance().getShape(id));History.getInstance().execute(shapeCmd);}@Overridep ublic void draw(Pane target, Object n){if (n instanceof Node){target.getChildren().add((Node) n);System.out.println("Draw " + target.getChildren());}else throw new IllegalArgumentException();}Ps:这里用到了命令模式,主要实现了client与具体实现者的解耦,所有的命令有Invoker发出。

3.3 事件处理实现事件处理的代码:(点击事件与拖拽为例)public void handle(MouseEvent event){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());}else if (event.getEventType() == MouseEvent.MOUSE_DRAGGED) {// Set new layout X and Y values for polygonthis.m_internalEventBound.setLayoutX(event.getSceneX() +this.m_deltaPoly.getX());this.m_internalEventBound.setLayoutY(event.getSceneY() +this.m_deltaPoly.getY());}}3.4 获取图形获取图形实例代码:public static Cache getInstance(){if (Cache.m_instance == null){synchronized (Cache.class){if (Cache.m_instance == null){Cache.m_instance = new Cache();}}}return Cache.m_instance;}Ps:这里用到了单例模式。

3.5 撤销与恢复操作撤销与恢复操作代码:public void undo(){if (!m_undos.isEmpty()){Command cmd = m_undos.pop();cmd.undo();m_redos.push(cmd);}else System.out.println("Nothing to undo.");}p ublic void redo(){if (!m_redos.isEmpty()){Command cmd = m_redos.pop();cmd.redo();m_undos.push(cmd);}else System.out.println("Nothing to redo.");}4 测试对画图软件进行功能测试,对于绘制基本图形的绘画,以及对于填充颜色,边框颜色没有问题。

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

西南交通大学课程设计报告5 总结本软件的设计初衷,是为了学习设计模式,在本软件的设计中,其实用到了六种模式:单例模式,命令者模式,代理模式,原型模式,中介者模式及组合模式,用心观察才能体会到其中的作用。