您的位置:首页 > 编程语言 > Java开发

java命令模式

2015-08-21 21:03 567 查看
命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

命令模式包含如下角色:

Command: 抽象命令类
ConcreteCommand: 具体命令类
Invoker: 调用者
Receiver: 接收者
Client:客户类



代码

import java.util.List;
import java.util.ArrayList;

/* The Command interface */
public interface Command {
void execute();
}

/* The Invoker class */
public class Switch {
private List<Command> history = new ArrayList<Command>();

public Switch() {
}

public void storeAndExecute(Command cmd) {
this.history.add(cmd); // optional
cmd.execute();
}
}

/* The Receiver class */
public class Light {
public Light() {
}

public void turnOn() {
System.out.println("The light is on");
}

public void turnOff() {
System.out.println("The light is off");
}
}

/* The Command for turning on the light - ConcreteCommand #1 */
public class FlipUpCommand implements Command {
private Light theLight;

public FlipUpCommand(Light light) {
this.theLight = light;
}

public void execute(){
theLight.turnOn();
}
}

/* The Command for turning off the light - ConcreteCommand #2 */
public class FlipDownCommand implements Command {
private Light theLight;

public FlipDownCommand(Light light) {
this.theLight = light;
}

public void execute() {
theLight.turnOff();
}
}

/* The test class or client */
public class PressSwitch {
public static void main(String[] args){
Light lamp = new Light();
Command switchUp = new FlipUpCommand(lamp);
Command switchDown = new FlipDownCommand(lamp);

Switch mySwitch = new Switch();

try {
if ("ON".equalsIgnoreCase(args[0])) {
mySwitch.storeAndExecute(switchUp);
}
else if ("OFF".equalsIgnoreCase(args[0])) {
mySwitch.storeAndExecute(switchDown);
}
else {
System.out.println("Argument \"ON\" or \"OFF\" is required.");
}
} catch (Exception e) {
System.out.println("Arguments required.");
}
}
}


命令模式的优点

降低系统的耦合度。
新的命令可以很容易地加入到系统中。
可以比较容易地设计一个命令队列和宏命令(组合命令)。
可以方便地实现对请求的Undo和Redo。

命令模式的缺点

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: