在命令模式中使用lambdas

时间:2016-07-12 15:39:52

标签: java design-patterns lambda

我希望了解如何使我现有的命令模式实现适应JAVA 8 lambdas。

@FunctionalInterface
public interface Command {

    public void execute(final Vehicle vehicle);
}

public class LeftCommand implements Command {

public void execute(final Vehicle vehicle){
    vehicle.turnLeft();
}

}

public class RightCommand implements Command {

public void execute(final Vehicle vehicle){
    vehicle.turnRight();
}

}

我有一个类VehicleManager,它调用processValue,它根据字符串L或R创建命令,并将其作为inputValue传递给它

processValues(Vehicle vehicle, String inputValue){
if("L".equals(inputValue){
  //create left command here
  Command cmd = (vehicle) -> vehicle.turnLeft(); //ERROR
  Command cmd = () -> vehicle.turnLeft(); //ERROR,expects 1 parameter vehicle to be passed
 }else{
 // create right command here
  Command cmd = (vehicle) -> vehicle.turnRight(); //ERROR
 }
}

我尝试使用如上所述的lambdas创建命令,但它错误地说已经定义了车辆。

  1. 关于如何使用lambdas创建左右命令实例,请告诉我吗?

  2. 如果我能成功使用上面的lambda,那么我可以取消我的LeftCommand和RightCommand类吗?

  3. (我在google上检查了很多链接,但我无法让它工作)。

    在此帖后添加了一些评论,

     private void processValues(String line, Vehicle vehicle) {
        List<Command> commands = new ArrayList<>();
        for(char c: line.toCharArray()){
            if(LEFT.equals(c)){
                commands.add(()-> vehicle.turnLeft());
            }else if(RIGHT.equals(c)){
                commands.add(()-> vehicle.turnRight());
            }else if(MOVE.equals(c)){
                commands.add(()-> rover.moveForward());
            }
        }
        commands.forEach((c) -> c.execute());
    }
    

    这是对的吗?

1 个答案:

答案 0 :(得分:3)

在命令模式中使用lambda或方法引用会使RightCommandLeftCommand类失效。

在你的第一个例子中,应该适用于这样的事情:

private void processValues(Vehicle vehicle, String inputValue) {
  Command command;
  if ("Left".equals(inputValue)) {
    command = v -> v.turnLeft();  // <- With lambda expresion
  } else {
    command = Vehicle::turnRight; // <- With method reference
  }
  command.execute(vehicle);
}

可以在"Using the command pattern with lambda expressions"中找到更好的解释。