JAVA语言设计模式学习之Command模式——命令也是类
小标 2018-12-04 来源 : 阅读 895 评论 0

摘要:本文主要向大家介绍了JAVA语言设计模式学习之Command模式——命令也是类,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言设计模式学习之Command模式——命令也是类,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


  

Command模式——命令也是类


如果我们用一个类,来表示“进行某项工作”的命令,那么每一项工作就不在是“方法的调用”,而是一个表示命令的类的实例。如果想要管理工作的历史记录,只需要管理这些实例的集合即可,而且还可以随时再次执行过去的命令,或者是将过去的命令整合成一个新命令并执行。这就是Command模式。


Command有时也被称作事件。当发生鼠标,键盘按下事件时,我们可以先将这些事件作成实例,然后按照发生的顺序放入队列中。在需要处理事件的时候再按照顺序依次去处理它们。这种编程方式在GUI编程中经常遇到。


下面的示例程序是一个绘图软件,可以通过用户拖动鼠标来绘制点,还实现了颜色更改,撤销操作和清空绘图板等操作。


示例程序的运行结果如图。



示例程序的具体实现如下。


类和接口的一览表


  包

  名字

  说明
commandCommand表示“命令”的接口
commandMacroCommand表示“由多条命令整合成的命令”的类
commandDrawCommand表示“绘制一个点的命令”的类
commandColorCommand表示“改变颜色的命令”的类
drawerDrawable表示“绘制对象”的接口
drawerDrawCanvas表示“绘制对象”的类
defaultMain测试程序行为的类


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频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程