摘要:本文主要向大家介绍了JAVA语言设计模式学习之Command模式——命令也是类,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
本文主要向大家介绍了JAVA语言设计模式学习之Command模式——命令也是类,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
Command模式——命令也是类
如果我们用一个类,来表示“进行某项工作”的命令,那么每一项工作就不在是“方法的调用”,而是一个表示命令的类的实例。如果想要管理工作的历史记录,只需要管理这些实例的集合即可,而且还可以随时再次执行过去的命令,或者是将过去的命令整合成一个新命令并执行。这就是Command模式。
Command有时也被称作事件。当发生鼠标,键盘按下事件时,我们可以先将这些事件作成实例,然后按照发生的顺序放入队列中。在需要处理事件的时候再按照顺序依次去处理它们。这种编程方式在GUI编程中经常遇到。
下面的示例程序是一个绘图软件,可以通过用户拖动鼠标来绘制点,还实现了颜色更改,撤销操作和清空绘图板等操作。
示例程序的运行结果如图。
示例程序的具体实现如下。
类和接口的一览表
包 | 名字 | 说明 |
---|---|---|
command | Command | 表示“命令”的接口 |
command | MacroCommand | 表示“由多条命令整合成的命令”的类 |
command | DrawCommand | 表示“绘制一个点的命令”的类 |
command | ColorCommand | 表示“改变颜色的命令”的类 |
drawer | Drawable | 表示“绘制对象”的接口 |
drawer | DrawCanvas | 表示“绘制对象”的类 |
default | Main | 测试程序行为的类 |
Command接口
package command;
public interface Command {
public abstract void execute();
}
MacroCommand类
package command;
import java.util.Iterator;
import java.util.Stack;
public class MacroCommand implements Command {
private Stack commands = new Stack();
@Override
public void execute() {
Iterator it = commands.iterator();
while (it.hasNext()) {
((Command) it.next()).execute();
}
}
public void append(Command cmd) {
if (cmd != this) {
commands.push(cmd);
}
}
public void undo() {
if (!commands.empty()) {
commands.pop();
}
}
public void clear() {
commands.clear();
}
}
DrawCommand类
package command;
import drawer.Drawable;
import java.awt.*;
public class DrawCommand implements Command {
protected Drawable drawable;
private Point position;
public DrawCommand(Drawable drawable, Point position) {
this.drawable = drawable;
this.position = position;
}
@Override
public void execute() {
drawable.draw(position.x, position.y);
}
}
ColorCommand类
package command;
import drawer.Drawable;
import java.awt.*;
public class ColorCommand implements Command {
protected Drawable drawable;
private Color color;
public ColorCommand(Drawable drawable, Color color) {
this.drawable = drawable;
this.color = color;
}
@Override
public void execute() {
drawable.setColor(color);
}
}
Drawable接口
package drawer;
import java.awt.*;
public interface Drawable {
public abstract void init();
public abstract void draw(int x, int y);
public abstract void setColor(Color color);
}
DrawCanvas类
package drawer;
import command.ColorCommand;
import command.MacroCommand;
import java.awt.*;
public class DrawCanvas extends Canvas implements Drawable {
private Color color;
private int radius;
private MacroCommand history;
public DrawCanvas(int width, int height, MacroCommand history) {
setSize(width, height);
setBackground(Color.WHITE);
this.history = history;
init();
}
@Override
public void paint(Graphics g) {
history.execute();
}
@Override
public void init() {
color = Color.RED;
radius = 6;
history.append(new ColorCommand(this, color));
}
@Override
public void draw(int x, int y) {
Graphics g = getGraphics();
g.setColor(color);
g.fillOval(x - radius, y - radius, radius * 2, radius * 2);
}
@Override
public void setColor(Color color) {
this.color = color;
}
}
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号