使用命令模式设计一个java程序,该程序为一个图形绘制系统,该系统可以绘制矩形、椭圆、三角形等图形,包含恢复和撤销功能。
时间: 2024-02-13 17:04:12 浏览: 105
C++绘图程序,绘制矩形,直线,曲线,三角形,多边形,椭圆,圆;给图形上色,框选图形,文件存储,坐标显示等等功能
好的,以下是使用命令模式设计的Java程序:
首先,我们需要定义一个抽象命令类`Command`,它包含了撤销和恢复操作的方法:
```java
public abstract class Command {
public abstract void execute();
public abstract void undo();
public abstract void redo();
}
```
然后,我们需要定义具体的命令类,例如绘制矩形命令类`DrawRectangleCommand`,它继承自`Command`类,实现了`execute()`、`undo()`和`redo()`方法,来实现矩形的绘制、撤销和恢复操作:
```java
public class DrawRectangleCommand extends Command {
private Rectangle rectangle;
private DrawCanvas drawCanvas;
public DrawRectangleCommand(Rectangle rectangle, DrawCanvas drawCanvas) {
this.rectangle = rectangle;
this.drawCanvas = drawCanvas;
}
@Override
public void execute() {
drawCanvas.addShape(rectangle);
}
@Override
public void undo() {
drawCanvas.removeShape(rectangle);
}
@Override
public void redo() {
drawCanvas.addShape(rectangle);
}
}
```
同样的,我们也可以定义绘制椭圆命令类`DrawOvalCommand`、绘制三角形命令类`DrawTriangleCommand`,它们的实现与绘制矩形命令类类似。
接着,我们定义一个请求者类`Invoker`,它包含了一个命令列表和一个撤销和恢复的指针:
```java
public class Invoker {
private List<Command> commandList = new ArrayList<>();
private int undoPointer = -1;
public void executeCommand(Command command) {
command.execute();
commandList.add(command);
undoPointer++;
}
public void undo() {
if (undoPointer >= 0) {
Command command = commandList.get(undoPointer);
command.undo();
undoPointer--;
}
}
public void redo() {
if (undoPointer < commandList.size() - 1) {
undoPointer++;
Command command = commandList.get(undoPointer);
command.redo();
}
}
}
```
最后,我们定义一个绘制画布类`DrawCanvas`,它包含了所有绘制的图形,以及一个请求者实例,用于执行绘制命令:
```java
public class DrawCanvas {
private List<Shape> shapeList = new ArrayList<>();
private Invoker invoker = new Invoker();
public void addShape(Shape shape) {
invoker.executeCommand(new DrawShapeCommand(shape, this));
}
public void removeShape(Shape shape) {
invoker.executeCommand(new EraseShapeCommand(shape, this));
}
public void undo() {
invoker.undo();
}
public void redo() {
invoker.redo();
}
public void paint(Graphics g) {
for (Shape shape : shapeList) {
shape.draw(g);
}
}
}
```
在程序中,我们可以通过调用`DrawCanvas`的`addShape()`方法添加图形,`removeShape()`方法删除图形,`undo()`方法撤销上一步操作,`redo()`方法恢复上一步撤销的操作。
这样,我们就可以通过命令模式来实现一个简单的图形绘制系统,支持撤销和恢复操作。
阅读全文