Продолжу тему о поведенческих паттернах. В этой статье в центре внимания - команда. Тут тоже ничего сложного. У нас есть обьект-команда, который может что-то сделать, когда мы его об этом попросим. Чем это полезно? Тем, что мы можем передать эту команду куда угодно как обьект, возвращать её из функций и так далее. Польза очевидна. Реализуется это довольно просто, давайте посмотрим на примере нашей доблестной армии.
Итак, сначала интерфейс для всех команд. Это позволит нам передавать любой наследник интерфейса туда, где ожидатеся команда.
interface Command {
public void execute(String name);
}
Здесь метод только один - выполнить команду. Сразу передан аргумент - имя. Оно нам позже пригодится. Теперь создами три команды-наследника - Вспышка слева, В атаку и Драить сортир.
class FlashOnTheLeft implements Command {
public void execute(String name) {
System.out.print(name);
System.out.print(" упал на землю ногами к вспышке");
System.out.println();
}
}
class InTheAttack implements Command {
public void execute(String name) {
System.out.print(name);
System.out.print(" побежал в атаку");
System.out.println();
}
}
class WashWC implements Command {
public void execute(String name) {
System.out.print(name);
System.out.print(" драит сортир");
System.out.println();
}
}
Пусть у нас теперь будет полковник, отдающий команды после того, как ему доложили ситуацию
class Colonel {
public Command order(String situation) {
if (situation.equals("враг наступает")) {
InTheAttack a = new InTheAttack();
return a;
}
if (situation.equals("слева видна вспышка")) {
FlashOnTheLeft a = new FlashOnTheLeft();
return a;
}
WashWC a = new WashWC();
return a;
}
}
...И солдат, который может докладывать ситуацию и выполнять команды
class Soldier {
Colonel VasylyiPetrovich = new Colonel();
String name;
Soldier(String n) {
name = n;
}
public void reportTheSituation(String situation) {
Command com = VasylyiPetrovich.order(situation);
com.execute(name);
}
}
Все, маленькая модель армии у нас уже есть. Теперь проверим её на практике.
public class CommandExample {
public static void main(String[] args) {
Soldier vasya = new Soldier("Вася");
vasya.reportTheSituation("враг наступает");
vasya.reportTheSituation("слева видна вспышка");
vasya.reportTheSituation("Товарищ полковник, мне нечем заняться!");
}
}
Выводы программы:
Вася побежал в атаку
Вася упал на землю ногами к вспышке
Вася драит сортир
Вот и все. Один из самых простых и полезных паттернов. Импорты для запуска этого кода не нужны, файл - CommandExample.java.
Click to view
Музыка просто так, для разнообразия