public class Steps {
public void goSouth() {
System.out.println("step to south");
}
public void goNorth() {
System.out.println("step to north");
}
public void goEast() {
System.out.println("step to east");
}
public void goWest() {
System.out.println("step to west");
}
}
public abstract class StepsCommand implements Command {
protected Steps steps = new Steps();
}
public interface Command {
void execute();
}
public class GoEastCommand extends StepsCommand {
@Override
public void execute() {
steps.goEast();
}
}
public class GoNorthCommand extends StepsCommand {
@Override
public void execute() {
steps.goNorth();
}
}
public class GoSouthCommand extends StepsCommand {
@Override
public void execute() {
steps.goSouth();
}
}
public class GoWestCommand extends StepsCommand {
@Override
public void execute() {
steps.goWest();
}
}
public class Navigator {
private final List<StepsCommand> steps = new LinkedList<>();
private final List<StepsCommand> path = new LinkedList<>();
public Navigator registerStep(StepsCommand step) {
steps.add(step);
return this;
}
public void go() {
for(StepsCommand step : steps) {
step.execute();
((LinkedList)path).addFirst(step);
}
steps.clear();
}
public void goBack() {
for(StepsCommand step : path) {
step.execute();
}
path.clear();
}
}
public class Client {
public static void main(String[] args) {
Navigator navigator =
new Navigator().registerStep(new GoEastCommand())
.registerStep(new GoNorthCommand())
.registerStep(new GoNorthCommand())
.registerStep(new GoSouthCommand());
System.out.println("go");
navigator.go();
System.out.println("go back");
navigator.goBack();
}
}
/**
* Output:
* go
* step to east
* step to north
* step to north
* step to south
* go back
* step to south
* step to north
* step to north
* step to east
*/
четверг, 29 марта 2012 г.
Паттерн Комманда(Command). Пример кода
Подписаться на:
Комментарии к сообщению (Atom)
Привет, хорошая статья, но необходимо добавить тип StepsCommand в List класса Navigator, а то step.execute(); не сможет выполниться.
ОтветитьУдалитьСалют, Саратов! Спасибо за внимательность. Угловые скобки слопал редактор, приняв за теги. Исправил
Удалить