command_commander - CSDN
  • 命令模式(Command

    千次阅读 2020-06-12 14:08:35
    18、命令模式(Command) 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互...

    18、命令模式(Command)
    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:
    这里写图片描述

    Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码:
    [java] view plaincopy

    public interface Command {  
        public void exe();  
    }  
    

    [java] view plaincopy

    public class MyCommand implements Command {  
      
        private Receiver receiver;  
          
        public MyCommand(Receiver receiver) {  
            this.receiver = receiver;  
        }  
      
        @Override  
        public void exe() {  
            receiver.action();  
        }  
    }  
    

    [java] view plaincopy

    public class Receiver {  
        public void action(){  
            System.out.println("command received!");  
        }  
    }  
    

    [java] view plaincopy

    public class Invoker {  
          
        private Command command;  
          
        public Invoker(Command command) {  
            this.command = command;  
        }  
      
        public void action(){  
            command.exe();  
        }  
    }  
    

    [java] view plaincopy

    public class Test {  
      
        public static void main(String[] args) {  
            Receiver receiver = new Receiver();  
            Command cmd = new MyCommand(receiver);  
            Invoker invoker = new Invoker(cmd);  
            invoker.action();  
        }  
    }  
    

    输出:command received!
    这个很哈理解,命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开,熟悉Struts的同学应该知道,Struts其实就是一种将请求和呈现分离的技术,其中必然涉及命令模式的思想!
    其实每个设计模式都是很重要的一种思想,看上去很熟,其实是因为我们在学到的东西中都有涉及,尽管有时我们并不知道,其实在Java本身的设计之中处处都有体现,像AWT、JDBC、集合类、IO管道或者是Web框架,里面设计模式无处不在。因为我们篇幅有限,很难讲每一个设计模式都讲的很详细,不过我会尽我所能,尽量在有限的空间和篇幅内,把意思写清楚了,更好让大家明白。本章不出意外的话,应该是设计模式最后一讲了,首先还是上一下上篇开头的那个图:
    这里写图片描述

    本章讲讲第三类和第四类。

    展开全文
  • Command 的基本用法

    2011-09-29 19:40:35
    使用 Command 对象查询数据库并返回 Recordset 对象中的记录,以便执行大量操作或处理数据库结构。取决于提供者的功能,某些 Command 集合、方法或属性被引用时可能会产生错误。 可以使用 Command 对象的集合、...
    使用 Command 对象查询数据库并返回 Recordset 对象中的记录,以便执行大量操作或处理数据库结构。取决于提供者的功能,某些 Command 集合、方法或属性被引用时可能会产生错误。

    可以使用 Command 对象的集合、方法、属性进行下列操作:
    使用 CommandText 属性定义命令(例如,SQL 语句)的可执行文本。

    通过 Parameter 对象和 Parameters 集合定义参数化查询或存储过程参数。

    可使用 Execute 方法执行命令并在适当的时候返回 Recordset 对象。

    执行前应使用 CommandType 属性指定命令类型以优化性能。

    使用 Prepared 属性决定提供者是否在执行前保存准备好(或编译好)的命令版本。

    使用 CommandTimeout 属性设置提供者等待命令执行的秒数。

    通过设置 ActiveConnection 属性使打开的连接与 Command 对象关联。

    设置 Name 属性将 Command 标识为与 Connection 对象关联的方法。

    将 Command 对象传送给 Recordset 的 Source 属性以便获取数据。

    注意 如果不想使用 Command 对象执行查询,请将查询字符串传送给 Connection 对象的 Execute 方法或 Recordset 对象的 Open 方法。但是,当需要使命令文本具有持久性并重新执行它,或使用查询参数时,则必须使用 Command 对象。

    要独立于先前已定义的 Connection 对象创建 Command 对象,请将它的 ActiveConnection 属性设置为有效的连接字符串。ADO 仍将创建 Connection 对象,但它不会将该对象赋给对象变量。但是,如果正在将多个 Command 对象与同一个连接关联,则必须显式创建并打开 Connection 对象,这样即可将 Connection 对象赋给对象变量。如果没有将 Command 对象的 ActiveConnection 属性设置为该对象变量,则即使使用相同的连接字符串,ADO 也将为每个 Command 对象创建新的 Connection 对象。

    要执行 Command,只需通过它所关联的 Connection 对象的 Name 属性,将其简单调用即可。必须将 Command 的 ActiveConnection 属性设置为 Connection 对象。如果 Command 带有参数,则将这些参数的值作为参数传送给方法。

    如果在相同连接上执行两个或多个 Command 对象,并且某个 Command 对象是带输出参数的存储过程,这时会发生错误。要执行各个 Command 对象,请使用独立的连接或将所有其他 Command 对象的连接断开。
    展开全文
  • 》》表示命令的类的实例,即可以用"物"来表示。...》》Command 有时也称为事件(event) ,它与“事件驱动程序”中的  “事件“是一样的意思。当发生点击鼠标、按下键盘按键等事件时,我们  可以先

    》》表示命令的类的实例,即可以用"物"来表示。要想管理工作的历史记录,

            只需管理这些实例的集合即可,而且还可以随时再次执行过去的命令,

            或是将过去的命令整合为一个新的命令并执行。

    》》Command 有时也称为事件(event) ,它与“事件驱动程序”中的

            “事件“是一样的意思。当发生点击鼠标、按下键盘按键等事件时,我们

          可以先将这些事件作成实例,然后按照发生顺序放入队列中。接着,再

          依次去处理它们。在GUI 编程中,经常需要与”事件“打交道。

    -------------------下面的示例程序是一个画图软件,它的功能很简单,即用户

              拖动鼠标时程序会绘制出红色圆点,点击 clear 按钮后会清除所有的

            圆点

    》》运行的结果:

             

    》》示例程序的类图:

              

    》》Command 接口:

            package command.command;
    /*
     * 该接口是表示“命令”的接口,该接口的作用是:“执行”什么东西
     */
    public interface Command {
    public abstract void execute();


    }

    》》MacroCommand  类:

            package command.command;
    import java.util.Iterator;
    import java.util.Stack;
    /*
     * 该类表示“由多条命令整合成的命令”
     */
    public class MacroCommand implements Command {
    //命令的集合
    private Stack commands = new Stack();
    //执行
    public void execute(){
    //获取该栈的迭代器
    Iterator it=commands.iterator();
    while(it.hasNext()){
    ((Command)it.next()).execute();
    }

    }

    //添加命令
    public void append(Command cmd){
    /*
    * if 语句的作用是防止不小心将自己(this)添加进去。
    * 如果这么做了,execute 方法将会陷入循环,永远不停地执行。
    */
    if(cmd != this){
    commands.push(cmd);
    }
    }

    //删除最后一条命令
    public void undo(){
    if(!commands.empty()){
    commands.pop();
    }
    }

    //删除所有命令
    public void clear(){
    commands.clear();
    }
    }

    》》DrawCommand 类:

              package command.drawer;


    import java.awt.Point;


    import command.command.Command;
    /*
     * 该类表示“绘制一个点的命令”
     * 
     * Point类表示由 X轴 和 Y轴构成的平面上的坐标。
     */
    public class DrawCommand implements Command {
    //绘制对象
    protected Drawable drawable;
    //绘制位置
    private Point position;
    //构造函数
    public DrawCommand(Drawable drawable , Point position){
    this.drawable = drawable;
    this.position = position;
    }
    //执行
    public void execute(){
    drawable.draw(position.x, position.y);
    }


    }

    》》Drawable 接口:

             package command.drawer;
    /*
     * 该接口表示“绘制对象”的接口,draw 方法是用于绘制的方法
     */
    public interface Drawable {
    public abstract void draw(int x ,int y);


    }

    》》DrawCanvas 类:

             package command.drawer;
    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import command.command.MacroCommand;
    /*
     * 该类继承  Canvas ,Canvas 相当于一个 画布
     */


    public class DrawCanvas extends Canvas implements Drawable{
    //当前画笔的颜色
    private Color color = Color.red;
    //要绘制的圆点的半径
    private int radius = 6;
    //命令的历史记录
    private MacroCommand history;
    //构造函数
    public DrawCanvas(int width , int height , MacroCommand history){
    //设置画布的宽和高
    setSize(width , height);
    //设置画布的背景色
    setBackground(Color.white);
    this.history = history;

    }

    //重新全部绘制
    public void paint(Graphics g){
    history.execute();

    }

    //绘制
    public void draw(int x ,int y){
    //在该画布中获取画笔
    Graphics g = getGraphics();
    //设置该画笔的颜色
    g.setColor(color);
    //画圆点
    g.fillOval(x-radius, y-radius, radius*2, radius*2);
    }


    }

    》》Main 类:

          补充:在该类的构造函数中设置了用于接收鼠标按下等事件的监听器,

                     并安排了各个控件(组件)在界面中的布局。

                     在javax.swing.JFrame 中,必须将控件放置在通过getContentPane

                    方法获取的容器之内。

             package command.drawer;
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JButton;
    import javax.swing.Box;


    import java.awt.Point;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.awt.event.MouseMotionListener;
    import java.awt.event.ActionEvent;
    import java.awt.event.MouseEvent;


    import command.command.Command;
    import command.command.MacroCommand;


    public class Main extends JFrame implements ActionListener,WindowListener,
        MouseMotionListener{
    //绘制的历史记录
    private MacroCommand history = new MacroCommand();
    //绘制区域
    private DrawCanvas canvas = new DrawCanvas(400,400,history);
    //删除按钮
    private JButton clearButton = new JButton("clear");

    //构造函数
    public Main(String title){
    /*
    * 调用父类 JFrame 里面构造函数  public JFrame(String title)
                                          throws HeadlessException
    */
    super(title);
    /*
    * 对下面添加监听器时传入的参数的理解:该参数应该是实现了监听器(接口)里面的
    * 方法的实例的引用
    */
    //给当前窗口对象添加  窗口监听器
    this.addWindowListener(this);
    //给按钮添加 事件监听器
    clearButton.addActionListener(this);
            //给画布添加鼠标移动监听器
    canvas.addMouseMotionListener(this);

    //在JFrame里面添加组件
    Box buttonBox  = new Box(BoxLayout.X_AXIS);
    buttonBox.add(clearButton);
    Box mainBox = new Box(BoxLayout.Y_AXIS);
    mainBox.add(buttonBox);
    mainBox.add(canvas);
    getContentPane().add(mainBox);
    //调整此窗口的大小,以适合其子组件的首选大小和布局。
    pack();
    //代替 show() 显示出来
    setVisible(true);
    }

    //java.awt.event.ActionListener 接口里面的方法,发生操作时
    //会调用下面的方法
    public void actionPerformed(ActionEvent e){
    //getSource():获取最初发生 Event 的对象
    if(e.getSource() == clearButton ){
    //清除所有的命令
    history.clear();
    //重绘此组件。
    canvas.repaint();
    }

    }
    /*
    *java.awt.event.WindowListener 接口里面的方法
    */
    //将 Window 设置为活动 Window 时调用。只有框架或对话框可以成为活动 Window。
    public void windowActivated(WindowEvent e){

    }
    //窗口首次变为可见时调用。
    public void windowOpened(WindowEvent e){

    }
    //用户试图从窗口的系统菜单中关闭窗口时调用。 
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
    //因对窗口调用 dispose 而将其关闭时调用。
    public void windowClosed(WindowEvent e){

    }
    //窗口从正常状态变为最小化状态时调用。
    public void windowIconified(WindowEvent e){

    }
    //窗口从最小化状态变为正常状态时调用。
    public void windowDeiconified(WindowEvent e){

    }
    //当 Window 不再是活动 Window 时调用。
    public void windowDeactivated(WindowEvent e){

    }


    /*
    * java.awt.event.MouseMotionListener 
    * 接口中的方法
    */
    //鼠标按键在组件上按下并拖动时调用。
    public void mouseDragged(MouseEvent e){
    //e.getPoint() 返回鼠标当前位置(已经按下)相对于源组件的 x, y 坐标。 
    Command cmd = new DrawCommand(canvas , e.getPoint());
       history.append(cmd);
       cmd.execute();
    }
    //鼠标光标移动到组件上但无按键按下时调用。 
    public void mouseMoved(MouseEvent e){

    }
    public static void main(String[] args){
    new Main("Command Pattern Sample");
    }


    }

    --------------------------------------

         《控件布局》

          

    -----------------------------------------------------------------------

            《Command 模式中的登场角色》

             ***   Command ( 命令)

                      Command 角色负责定义命令的接口。在示例程序中,由 Command 接口扮演此角色。

             *** ConcreteCommand (具体的命令)

                    ConcreteCommand 角色负责实现在 Command 角色中定义的接口。在示例程序中,由

                    MacroCommand 类 和 DrawCommand 类扮演此角色。

             *** Receiver (接收者)

                   Receiver 角色是 Command 角色执行命令时的对象,也可以称其为命令接收者。在示例

                   程序中 由 DrawCanvas 类接收  DrawCommand 的命令。

             *** Client (请求者)

                    Client 角色负责生成 ConcreteCommand 角色并分配 Receiver 角色。在示例程序中,由

                    Main 类扮演此角色。在响应鼠标拖拽事件时,它生成了  DrawCommand  类的实例,并

                   将扮演 Receiver 角色的 DrawCanvas 类的实例传递给了DrawCommand 类的构造函数。

             ***  Invoker (发动者)

                    Invoker 角色是开始执行命令的角色,它会调用在Command 角色中定义的接口。在示例

                   程序中,由 Main 类和 DrawCanvas 类扮演此角色。这两个类都调用了 Command 接口中

                    的 execute 方法。Main 类同时扮演了  Client 角色 和 Invoker 角色。

    ----------------------------------------------------------------------------------------

                 《扩展思路的要点》

                  1.命令中应该包含哪些信息

                          ****命令的目的不同,应该包含的信息也不同。

                          **** 在上面示例中,DrawCommand 类中的 drawable 字段表示的是绘制对象(具体的

                              命令接收者)。

                          *** 在 ConcreteCommand 角色中只要知道自己的 Receiver 角色,不论谁来管理或持有

                               ConcreteCommand 角色,都可以执行 execute 方法的。

                  2.保存历史记录

                           ***  在Main 类中,MacroCommand 类的实例(history)代表了绘制的历史记录。在该

                              字段中保存了之前所有的绘制信息。也就是说,如果我们将它保存为文件,就可以永久

                              保存历史记录。

                  3.适配器

                           ***在 Main 类中,我们实现了 3 个接口:ActionListener 、WindowListener 、

                              MouseMotionListener  。这三个接口下面的方法,都需要进行实现(即使是空的方法)

                              有的方法调用了,有的方法没有调用。

                           *** 为了简化程序,java.awt.event 提供了一些被称为适配器(Adapter)的类。

                                    

                           ****  在适配器中已经实现了接口中所定义的所有方法。不过,所有的实现都是空

                        (即什么都不做)的。因此,我们只要编写一个 适配器的子类,然后实现所需要的

                        方法即可,而不必在意其他不需要的方法。

                           **** 特别是把 java 匿名内部类适配器结合起来使用时,可以更轻松地编写程序。

                           **** 在编译匿名内部类时,生成的类文件的名字会像下面这样,其命名规则是:

                                  “主类名 $ 编号.class”

                                  eg: Main$1.class

    -------------------------------------------------------------------------

                           《相关的设计模式》

                          **** Composite 模式

                          **** Memento 模式

                          **** Prototype 模式

                    

    展开全文
  • command + tab 到应用后,松开 tab,然后按 option 上,再松开 command,就可以了。

    command + tab 到应用后,松开 tab,然后按 option 上,再松开 command,就可以了。

    展开全文
  • Command 组件

    2008-04-17 20:16:00
    Command 对象 ExecuteNonQuery 执行没有返回值得命令 ExecuteScalar 返回一个单独的值 ExecuteReader 通过DataReader对象返回一个结果集 CommandType属性,用于说明CommandText属性类型 Text:SQL文本命令 ...
  • Python--command模块

    万次阅读 2017-11-13 11:23:44
    command模块
  • Command模式

    2013-12-04 10:46:38
    14、COMMAND—俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。 这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面...
  • 那就是 Command ⌘ 键 . 但是你可能根本不知道这个键上面的图标的来历与前世今生. 那到底这个字符代表着什么, 而且又这么重要呢? ⌘ * 老款的Mac上还有苹果图标来标示Command Key 这个符号其实有很多的...
  • Linux下的 command not found错误(解决方法)

    万次阅读 热门讨论 2017-12-22 14:12:20
    Linux下的 command not found错误(解决方法)
  • linker command failed with exit code 1 (use -v to see invocation)这个错误貌似遇见并不止一次,当我想用某个第三方类库的时候(如SBJson),我直接把类库文件copy到工程目录里面,然后一编译就出现这样错误(并不是...
  • Command Buffer是Unity5新增的一个灰常灰常强大的功能。先祭出官方介绍和文档。我们在渲染的时候,给OpenGL或者DX的就是一系列的指令,比如glDrawElement,glClear等等,这些东西目前是引擎去调用的,而Unity也为...
  • 11种行为型模式之:命令模式(Command)

    万次阅读 2017-04-11 16:25:22
    定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销...Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute
  • python安装第三方库遇到 ERROR: Command errored out with exit status 1:…的问题 先来看看错误提示: 本来想用python弄个词云玩玩,没想到在安装wordcloud库的时候居然给我这一大串红叉叉,很是奔溃,出师不利啊!...
  • Xcode中Command Line Tools安装方法

    万次阅读 2016-06-27 00:50:01
    在从App Store上下载Xcode后,默认是不会安装Command Line Tools的,Command Line Tools是在Xcode中的一款工具,可以在命令行中运行C程序。为了学习Objective-C,现在也来学习一下如何安装Command Line Tools,具体...
  • 0x00 前言 文章中的文字可能存在语法错误以及...1.前几次还好用的命令,这次再输入就出现-bash: ***: command not found的情况; 2.第一次使用就出现 -bash: ** : command not found的情况。 导致这种问题的原...
  • [设计模式]Command命令模式

    千次阅读 2019-12-22 21:14:13
    command命令模式 Command模式通过将请求封装到一个对象(Command)中,并将请求的接收者存放到具体的ConcreteCommand类中的(reciver)中,从而实现调用操作的对象和操作的具体实现之间的解耦。 解析:Command模式...
  • -bash: wget: command not found的两种解决方法 今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包。一般linux最小化安装时,wget不会默认被安装。 可以...
  • Python报错ERROR: Command errored out with exit status 1:

    万次阅读 多人点赞 2020-08-24 10:48:01
    因为Pycharm最近老是弹出RELP COMMUNICATIONS,非常影响代码运行的效率。 REPL(Read-Eval-Print Loop),翻译过来就是“读取-求值-输出”循环,是一个简单的...ERROR: Command errored out with exit status 1: ...
  • Linux命令行报bash:.....:command not found的解决办法

    万次阅读 热门讨论 2008-07-30 14:21:00
    Linux命令行输入命令执行后报“bash:....:command not found”这是由于系统PATH设置问题,PATH没有设置对,系统就无法找到精确命令了。 1、在命令行中输入:export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/...
  • Command line is too long问题解决

    万次阅读 多人点赞 2018-07-09 20:38:59
    Idea启动项目报错:Command line is too long. Shorten command line for className or also for JUnit defaultconfiguration.如下图所示:解决方法:在该项目文件夹.idea/workspace.xml中找到<component name...
1 2 3 4 5 ... 20
收藏数 1,190,195
精华内容 476,078
关键字:

command