X.d 笔记

小Web,大世界

0%

设计模式(14):命令行模式 Command

设计模式有个特点,就是一看模式的命名,就大致知道是干什么的,使用场景也可能会和名称上的动作相关。

命令行模式 Command

命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

问题:

Need to issue requests to objects without knowing anything about the operation being requested or the receiver of the request.

意图:

  • Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.
  • Promote “invocation of a method on an object” to full object status
  • An object-oriented callback

代码

字面上还是比较好理解的,用起来要像window的comand,和linux的shell操作都比较像命令行模式
例:如其名,叫你干什么你就得干什么
代码一:命令:工作,睡觉

public interface Comand {
    public void work();
    public void sheep();
}

代码二:苦命的工人,可以执行这些命令

package com.xdnote.DesignPattern.behavioral.command;
public class Receiver1 implements Comand{
    private String name = "苦工1号";
    @Override
    public void work() {
        System.out.println("这里是"+this.name+" 执行命令:work");
    }

    @Override
    public void sheep() {
        System.out.println("这里是"+this.name+" 执行命令:sheep");
    }
}
public class Receiver2 implements Comand{

    private String name = "苦工2号";
    @Override
    public void work() {
        System.out.println("这里是"+this.name+" 执行命令:work");

    }
    @Override
    public void sheep() {
        System.out.println("这里是"+this.name+" 执行命令:sheep");
    }
}

代码三:老板的走狗(命令工厂),自己不干活,只会叫别人干活

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ComandFactory {
    public static void execute(String receiver,String comand){
        Object obj = Class.forName(receiver).newInstance();
        Method method = obj.getClass().getMethod(comand, null);
        method.invoke(obj, null);
    }
}

代码四:老板,想怎么玩就怎么玩的牛B人物

/**
 * @author xdnote.com
 * 命令模式 如其名,要你干嘛你干嘛
 * */
public class Boss {
    //你可以发出的命令
    private static final String[] COMANDS = {"work", "sheep"};
    //你可以安排的执行者
    private static final String[] RECEIVERS= {"com.xdnote.DesignPattern.behavioral.command.Receiver1", "com.xdnote.DesignPattern.behavioral.command.Receiver2"};

    public static void main(String[] args){
        ComandFactory.execute(RECEIVERS[0], COMANDS[1]);
        ComandFactory.execute(RECEIVERS[1], COMANDS[0]);
        ComandFactory.execute(RECEIVERS[0], COMANDS[0]);
        ComandFactory.execute(RECEIVERS[1], COMANDS[1]);
    }
}

小结

命令行模式 Command

  • 使用频率:较高
    命令行模式,用的还是非常多的(但一般不向上面的代码那样标准),如果你有想过自己写个灵活点的架构,那肯定得用上。

  • 利弊影响:
    由于都是原理是反射,虽然可大大增加灵活度,但要保障程序安全还得大大的测试,如果给菜鸟做就不太放心了。