Паттерн Команда инкапсулирует запрос в виде объекта, делая возможной параметризацию клиентских объектов с другими запросами, организацию очереди или регистрацию запросами, а также поддержку отмены операций.
public interface Command { public void execute(); public void undo(); } class LightOnCommand implements Command { Light light; public LightOnCommand(Light light) { this.light = light; } public void execute() { light.On(); } public void undo() { light.Off(); } } class LightOffCommand implements Command { Light light; public LightOffCommand(Light light) { this.light = light; } public void execute() { light.Off(); } public void undo() { light.On(); } } class GarageOpenCommand implements Command { Garage garage; public GarageOpenCommand(Garage garage) { this.garage = garage; } public void execute() { garage.Open(); } public void undo() { garage.Close(); } } class GarageCloseCommand implements Command { Garage garage; public GarageCloseCommand(Garage garage) { this.garage = garage; } public void execute() { garage.Close(); } public void undo() { garage.Open(); } }
public class Light { public void On() { System.out.println("Включить свет"); } public void Off() { System.out.println("Выключить свет"); } }
public class Garage { public void Open() { System.out.println("Открыть гараж"); } public void Close() { System.out.println("Закрыть гараж"); } }
public class Main { public static void main(String[] args) { ArrayList <Command> list = new ArrayList(); list.add(new LightOnCommand(new Light())); list.get(list.size()-1).execute(); list.add(new LightOffCommand(new Light())); list.get(list.size()-1).execute(); list.add(new GarageOpenCommand(new Garage())); list.get(list.size()-1).execute(); list.get(list.size()-1).undo();/*отмена операций*/ /*Действие назад*/ list.remove(list.get(list.size()-1)); list.get(list.size()-1).execute(); /* Включить свет Выключить свет Открыть гараж Закрыть гараж Открыть гараж */ } }