Шаблон Command Java

Необходимо создать объект-команду, метод которого может быть вызван, а сам объект может быть сохранен и передан в качестве параметра метода или возвращен как любой другой объект. Инкапсулирует запрос как объект.

Объект-источник запроса отделяется от команды, но от его типа зависит, какая из команд будет выполнена.

clip_image002

Рис. 5.11. Пример реализации шаблона Command

/*пример # 27 : описание команды и конкретные реализации : Command.java : AddCommand.java : MultCommand.java */

package chapt05.command;

public abstract class Command {

public abstract void execute();

}

package chapt05.command;

import chapt05.receiver.*;

public class MultCommand extends Command {

private ArrayOperation ao;

public MultCommand (ArrayOperation ao) {

this.ao = ao;

}

public void execute () {

this.ao.product();

}

}

package chapt05.command;

import chapt05.receiver.*;

public class AddCommand extends Command {

private ArrayOperation ao;

public AddCommand (ArrayOperation ao) {

this.ao = ao;

}

public void execute() {

this.ao.sum();

}

}

/*пример # 28 : класс Receiver (получатель) – располагает информацией о способах выполнения операций : ArrayOperation.java */

package chapt05.receiver;

public class ArrayOperation {

private int[] mass;

public ArrayOperation(int[] mass) {

this.mass = mass;

}

public void sum() {

int sum = 0;

for (int i : mass)

sum += i;

System.out.println(sum);

}

public void product() {

int mult = 1;

for (int i : mass)

mult *= i;

System.out.println(mult);

}

}

/*пример # 29 : класс Invoker (инициатор)-обращается к команде для выполнения запроса : ManagerCommands.java */

package chapt05.invoker;

import chapt05.command.*;

public class ManagerCommands {

private Command command;

public ManagerCommands(Command command) {

this.command = command;

}

public void setManager(Command command) {

this.command = command;

}

public void exec() {

command.execute();

}

}

/*пример # 30 : простое использование шаблона Command : Main.java */

package chapt05;

import chapt05.invoker.*;

import chapt05.receiver.*;

import chapt05.command.*;

public class Main {

public static void main(String[] args) {

int mass[] = {-1, 71, 45, -20, 48, 60, 19};

/*класс получатель(Receiver)-располагают информацией о способах

выполнения операций*/

ArrayOperation receiver = new ArrayOperation (mass);

//инициализация команды

Command operation1 = new MultCommand(receiver);

Command operation2 = new AddCommand(receiver);

//класс инициатор (Invoker)-обращается к команде для выполнения запроса

ManagerCommands manager = new ManagerCommands(operation1);

manager.exec();

manager.setManager(operation2);

manager.exec();

}

}

Объект-команда получен прямой инициализацией на основе переданного параметра. На практике данный объект создается или извлекается из коллекции на основе признака вызываемой команды. Объект ManagerCommands инициализируется командой и обладает простым интерфейсом для выполнения специализируемой задачи. В этом случае появляется возможность изменять реакцию приложения на запрос команды простой заменой объекта-управления.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100