嗨,您好!
今天,我将与您分享一种非常出色的编程设计模式。 它有很多用法,是我的最爱之一。 编程设计模式命令具有多种用例。 在这篇文章中,我们将看到如何实现现实世界中的某些东西。
我们将使用电子汽车钥匙来打开,关闭门,启用,禁用警报,打开,关闭车库门或打开和关闭汽车的引擎盖和行李箱。
我将向您展示的示例是一个非常普通的示例,因此您随时可以回到这里,并在您的应用程序中使用它。
UML命令模式
如您所知,我总是通过在UML图上显示类图来启动项目。 这有助于我们以一种精巧,紧凑的方式修复该示例的概述。
解释细节编程设计
我们的客户是法拉利车主(FerrariCleint)。 它有一个CarKey。 CarKey具有可通过命令配置的通用MicroShip(Involker)。 命令(OpenDoorCommand)本身具有要执行的动作(DoorAction)。 CarKey可以配置do和undo命令。 NullObjectCommand属于Null对象设计模式,并且还将在此处使用。 现在让我们在代码中查看实现细节。
指挥与微舰
NullObjectCommand在这里用于避免空指针异常,并且只要未定义任何命令就什么都不执行。
public interface Command {
void execute();
}
public class MicroChip {
protected Command[] onCommands;
protected Command[] offCommands;
public MicroChip(int commandQuantity) {
onCommands = new Command[commandQuantity];
offCommands = new Command[commandQuantity];
Command nullObjecCommand = new NullObjectCommand();
for (int i = 0; i < commandQuantity; i++) {
onCommands[i]=nullObjecCommand;
offCommands[i]=nullObjecCommand;
}
}
public void configureCommand(int position, Command on, Command off){
onCommands[position]=on;
offCommands[position]=off;
}
public void executeOnCommand(int position){
onCommands[position].execute();
}
public void executeOffCommand(int position){
offCommands[position].execute();
}
protected class NullObjectCommand implements Command{
@Override
public void execute() {
// NULL-OBJECT-PATTERN
}
}
}
具体的命令和动作
在这里,我们可以看到Actions和Commands的具体实现。
public class Door {
public void on(){
System.out.println("Opening car doors...");
}
public void off(){
System.out.println("Closing car doors...");
}
}
public class OpenDoorCommand implements Command {
private Door door;
public OpenDoorCommand(Door door) {
this.door = door;
}
@Override
public void execute() {
door.on();
}
}
public class CloseDoorCommand implements Command {
private Door door;
public CloseDoorCommand(Door door) {
this.door =door;
}
@Override
public void execute() {
door.off();
}
}
通用微型船
如您在这里看到的,此实现或此MicroShip可以容纳所需数量的命令,并且可以在您可能需要的任何情况下重用。 在此MicroShip波纹管中,我只实现了上面的OpenDoorCommand和CloseDoorCommand,因此您可以看到它的强大功能。 像我一样,您还可以执行其他命令。这很酷的事情是执行和撤消操作的能力。 创建所需数量的命令并执行所需的动作。 这种图案的简单和美丽使我着迷。
public class CarKey {
private MicroChip microChip;
public CarKey() {
final int commandQuantity = 5;
microChip = new MicroChip(commandQuantity);
final Hood hood = new Hood();
final OpenHoodCommand openHoodCmd = new OpenHoodCommand(hood);
final CloseHoodCommand closeHoodCmd = new CloseHoodCommand(hood);
microChip.configureCommand(0, openHoodCmd, closeHoodCmd);
final Door door = new Door();
final OpenDoorCommand openDoorCmd = new OpenDoorCommand(door);
final CloseDoorCommand closeDoorCmd = new CloseDoorCommand(door);
microChip.configureCommand(1, openDoorCmd, closeDoorCmd);
final Garage garage = new Garage();
final OpenGarageCommand openGarageCmd = new OpenGarageCommand(garage);
final CloseGarageCommand closeGarageCmd = new CloseGarageCommand(garage);
microChip.configureCommand(2, openGarageCmd, closeGarageCmd);
final Trunk trunk = new Trunk();
final OpenTrunkCommand openTrunkCmd = new OpenTrunkCommand(trunk);
final CloseTrunkCommand closeTrunkCmd = new CloseTrunkCommand(trunk);
microChip.configureCommand(3, openTrunkCmd, closeTrunkCmd);
final Alarm alarm = new Alarm();
final EnableAlarmCommand enableAlarmCmd = new EnableAlarmCommand(alarm);
final DisableAlarmCommand disableAlarmCmd = new DisableAlarmCommand(alarm);
microChip.configureCommand(4, enableAlarmCmd, disableAlarmCmd);
}
public void openHood(){microChip.executeOnCommand(0);}
public void closeHood(){microChip.executeOffCommand(0);}
public void openDoor(){microChip.executeOnCommand(1);}
public void closeDoor(){microChip.executeOffCommand(1);}
public void openGarage(){microChip.executeOnCommand(2);}
public void closeGarage(){microChip.executeOffCommand(2);}
public void openTrunk(){microChip.executeOnCommand(3);}
public void closeTrunk(){microChip.executeOffCommand(3);}
public void enableAlarm(){microChip.executeOnCommand(4);}
public void disableAlarm(){microChip.executeOffCommand(4);}
}
法拉利客户
最后,我们可以看到这种漂亮的设计模式的用法和功能。 在此示例中,我实现了多个命令来向您展示它的外观。
public class FerrariClient {
public static void main(String[] args) {
final CarKey ferrariSwitchbladeKey = new CarKey();
ferrariSwitchbladeKey.openHood();
ferrariSwitchbladeKey.openGarage();
ferrariSwitchbladeKey.openTrunk();
ferrariSwitchbladeKey.openDoor();
ferrariSwitchbladeKey.enableAlarm();
System.out.println("-------------------------------");
ferrariSwitchbladeKey.closeHood();
ferrariSwitchbladeKey.closeGarage();
ferrariSwitchbladeKey.closeTrunk();
ferrariSwitchbladeKey.closeDoor();
ferrariSwitchbladeKey.disableAlarm();
}
}
就这样。 希望你喜欢!
翻译自: https://www.javacodegeeks.com/2014/08/command-design-pattern-applied.html