温州专业微网站制作网络公司,wordpress非插件幻灯片,wordpress 高仿 主题下载,缙云做网站简介
本篇文章将介绍如何设计一个图形编辑器系统,系统包括图形对象的创建、组合、操作及撤销等功能。我们将通过这一项目,应用命令模式、组合模式和备忘录模式来解决具体的设计问题。
问题描述
设计一个图形编辑器系统,用户可以创建并操作图形对象,将多个图形对象组合成…简介
本篇文章将介绍如何设计一个图形编辑器系统,系统包括图形对象的创建、组合、操作及撤销等功能。我们将通过这一项目,应用命令模式、组合模式和备忘录模式来解决具体的设计问题。
问题描述
设计一个图形编辑器系统,用户可以创建并操作图形对象,将多个图形对象组合成更复杂的图形,支持操作的撤销与重做。
设计分析
业务流程说明
整个图形编辑器系统的业务流程如下:
用户创建图形对象。用户组合多个图形对象。用户对图形对象进行操作(如移动、删除)。用户撤销或重做操作。流程图 #mermaid-svg-cpS9CPwVHqeLPad2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cpS9CPwVHqeLPad2 .error-icon{fill:#552222;}#mermaid-svg-cpS9CPwVHqeLPad2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cpS9CPwVHqeLPad2 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-cpS9CPwVHqeLPad2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cpS9CPwVHqeLPad2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cpS9CPwVHqeLPad2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cpS9CPwVHqeLPad2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cpS9CPwVHqeLPad2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cpS9CPwVHqeLPad2 .marker.cross{stroke:#333333;}#mermaid-svg-cpS9CPwVHqeLPad2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cpS9CPwVHqeLPad2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cpS9CPwVHqeLPad2 .cluster-label text{fill:#333;}#mermaid-svg-cpS9CPwVHqeLPad2 .cluster-label span{color:#333;}#mermaid-svg-cpS9CPwVHqeLPad2 .label text,#mermaid-svg-cpS9CPwVHqeLPad2 span{fill:#333;color:#333;}#mermaid-svg-cpS9CPwVHqeLPad2 .node rect,#mermaid-svg-cpS9CPwVHqeLPad2 .node circle,#mermaid-svg-cpS9CPwVHqeLPad2 .node ellipse,#mermaid-svg-cpS9CPwVHqeLPad2 .node polygon,#mermaid-svg-cpS9CPwVHqeLPad2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cpS9CPwVHqeLPad2 .node .label{text-align:center;}#mermaid-svg-cpS9CPwVHqeLPad2 .node.clickable{cursor:pointer;}#mermaid-svg-cpS9CPwVHqeLPad2 .arrowheadPath{fill:#333333;}#mermaid-svg-cpS9CPwVHqeLPad2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cpS9CPwVHqeLPad2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cpS9CPwVHqeLPad2 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-cpS9CPwVHqeLPad2 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-cpS9CPwVHqeLPad2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cpS9CPwVHqeLPad2 .cluster text{fill:#333;}#mermaid-svg-cpS9CPwVHqeLPad2 .cluster span{color:#333;}#mermaid-svg-cpS9CPwVHqeLPad2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cpS9CPwVHqeLPad2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 创建图形对象 组合图形对象 操作图形对象 撤销操作 重做操作 模块依赖关系图 #mermaid-svg-VdpReMmen5jniveI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VdpReMmen5jniveI .error-icon{fill:#552222;}#mermaid-svg-VdpReMmen5jniveI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VdpReMmen5jniveI .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VdpReMmen5jniveI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VdpReMmen5jniveI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VdpReMmen5jniveI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VdpReMmen5jniveI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VdpReMmen5jniveI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VdpReMmen5jniveI .marker.cross{stroke:#333333;}#mermaid-svg-VdpReMmen5jniveI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VdpReMmen5jniveI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VdpReMmen5jniveI .cluster-label text{fill:#333;}#mermaid-svg-VdpReMmen5jniveI .cluster-label span{color:#333;}#mermaid-svg-VdpReMmen5jniveI .label text,#mermaid-svg-VdpReMmen5jniveI span{fill:#333;color:#333;}#mermaid-svg-VdpReMmen5jniveI .node rect,#mermaid-svg-VdpReMmen5jniveI .node circle,#mermaid-svg-VdpReMmen5jniveI .node ellipse,#mermaid-svg-VdpReMmen5jniveI .node polygon,#mermaid-svg-VdpReMmen5jniveI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VdpReMmen5jniveI .node .label{text-align:center;}#mermaid-svg-VdpReMmen5jniveI .node.clickable{cursor:pointer;}#mermaid-svg-VdpReMmen5jniveI .arrowheadPath{fill:#333333;}#mermaid-svg-VdpReMmen5jniveI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VdpReMmen5jniveI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VdpReMmen5jniveI .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-VdpReMmen5jniveI .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-VdpReMmen5jniveI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VdpReMmen5jniveI .cluster text{fill:#333;}#mermaid-svg-VdpReMmen5jniveI .cluster span{color:#333;}#mermaid-svg-VdpReMmen5jniveI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VdpReMmen5jniveI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} GraphicEditor Shape CompositeShape Circle Rectangle Command MoveCommand DeleteCommand CommandHistory Memento ShapeState 模式选择
图形对象设计
模式选择:组合模式原因:组合模式适用于将对象组合成树形结构以表示部分-整体层次。图形对象可以看作树结构中的叶子节点,而组合图形可以看作树的根节点。使用组合模式能够方便地处理图形对象的组合和操作。操作设计
模式选择:命令模式原因:命令模式用于将请求封装成对象,使得可以用不同的请求、队列或者日志来参数化其他对象。图形编辑器需要支持操作的撤销与重做,使用命令模式可以将这些操作封装成独立的对象,从而使系统更灵活和易于扩展。状态管理设计
模式选择:备忘录模式原因:备忘录模式用于在不破坏封装性的前提下捕获并保存一个对象的内部状态,以便在以后恢复它。图形编辑器需要支持操作的撤销与重做,使用备忘录模式可以保存图形对象的状态并在需要时恢复。详细设计与实现
数据模型
组合模式(图形对象)
import java.util.ArrayList;
import java.util.List;// 图形接口
interface Shape {void draw();void move(int x, int y);ShapeMemento saveState();void restoreState(ShapeMemento memento);
}// 圆形类
class Circle implements Shape {private int