设计模式有个特点,就是一看模式的命名,就大致知道是干什么的,使用场景也可能会和名称上的动作相关。
命令行模式 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
使用频率:
较高
命令行模式,用的还是非常多的(但一般不向上面的代码那样标准),如果你有想过自己写个灵活点的架构,那肯定得用上。利弊影响:
高
由于都是原理是反射,虽然可大大增加灵活度,但要保障程序安全还得大大的测试,如果给菜鸟做就不太放心了。