Команда (Command) — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (→Пример) |
Admin (обсуждение | вклад) (→Пример) |
||
Строка 19: | Строка 19: | ||
=== Пример === | === Пример === | ||
<source lang="Csharp"> | <source lang="Csharp"> | ||
+ | using System; | ||
+ | using System.Collections.Generic; | ||
+ | |||
+ | class AruthmeticUnit // Receiver | ||
+ | { | ||
+ | private double res = 0; | ||
+ | public void Add(double x) | ||
+ | { | ||
+ | res += x; | ||
+ | } | ||
+ | public void Sub(double x) | ||
+ | { | ||
+ | res -= x; | ||
+ | } | ||
+ | public void Div(double x) | ||
+ | { | ||
+ | res /= x; | ||
+ | } | ||
+ | public void Mult(double x) | ||
+ | { | ||
+ | res *= x; | ||
+ | } | ||
+ | public double Result | ||
+ | { | ||
+ | get { return res; } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | abstract class Command | ||
+ | { | ||
+ | public readonly AruthmeticUnit unit; | ||
+ | public Command(AruthmeticUnit unit) | ||
+ | { | ||
+ | this.unit = unit; | ||
+ | } | ||
+ | public abstract void Execute(); | ||
+ | } | ||
+ | |||
+ | class BinaryCommand: Command | ||
+ | { | ||
+ | private char op; | ||
+ | private double x; | ||
+ | public BinaryCommand(AruthmeticUnit unit, char op, double x): base(unit) | ||
+ | { | ||
+ | this.op = op; | ||
+ | this.x = x; | ||
+ | } | ||
+ | public override void Execute() | ||
+ | { | ||
+ | switch (op) | ||
+ | { | ||
+ | case '+': | ||
+ | unit.Add(x); | ||
+ | break; | ||
+ | case '-': | ||
+ | unit.Sub(x); | ||
+ | break; | ||
+ | case '*': | ||
+ | unit.Mult(x); | ||
+ | break; | ||
+ | case '/': | ||
+ | unit.Div(x); | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class ChangeSignCommand: Command | ||
+ | { | ||
+ | public ChangeSignCommand(AruthmeticUnit unit): base(unit) | ||
+ | { } | ||
+ | public override void Execute() | ||
+ | { | ||
+ | unit.Mult(-1); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class My // Одновременно Client (создает команды и Receiverа) и Invoker (выполняет команды) | ||
+ | { | ||
+ | public static void Main() | ||
+ | { | ||
+ | // Действия Clientа | ||
+ | var unit = new AruthmeticUnit(); | ||
+ | var l = new List<Command>(); | ||
+ | l.Add(new BinaryCommand(unit,'+',2)); | ||
+ | l.Add(new BinaryCommand(unit,'*',3)); | ||
+ | l.Add(new BinaryCommand(unit,'-',1)); | ||
+ | l.Add(new BinaryCommand(unit,'*',2)); | ||
+ | l.Add(new ChangeSignCommand(unit)); | ||
+ | |||
+ | // Действия Invokerа | ||
+ | foreach (var c in l) | ||
+ | c.Execute(); | ||
+ | Console.WriteLine(unit.Result); | ||
+ | } | ||
+ | } | ||
</source> | </source> | ||
*[http://itvdn.com/ru/patterns/command Реализация калькулятора с откатом действий] | *[http://itvdn.com/ru/patterns/command Реализация калькулятора с откатом действий] |
Версия 21:54, 1 августа 2014
Другое имя
Action (действие), Transaction (транзакция)
Назначение
Упаковка действий (запросов) в объекты, позволяя ставить запросы в очередь, выполнять логирование, комбинирование действий, поддерживать отмену операций.
Описание
В некоторых ситуациях необходимо посылать объектам запросы, ничего не зная о том, какое действие требуется выполнить
Реализация
Диаграмма классов
Участники
Пример
using System;
using System.Collections.Generic;
class AruthmeticUnit // Receiver
{
private double res = 0;
public void Add(double x)
{
res += x;
}
public void Sub(double x)
{
res -= x;
}
public void Div(double x)
{
res /= x;
}
public void Mult(double x)
{
res *= x;
}
public double Result
{
get { return res; }
}
}
abstract class Command
{
public readonly AruthmeticUnit unit;
public Command(AruthmeticUnit unit)
{
this.unit = unit;
}
public abstract void Execute();
}
class BinaryCommand: Command
{
private char op;
private double x;
public BinaryCommand(AruthmeticUnit unit, char op, double x): base(unit)
{
this.op = op;
this.x = x;
}
public override void Execute()
{
switch (op)
{
case '+':
unit.Add(x);
break;
case '-':
unit.Sub(x);
break;
case '*':
unit.Mult(x);
break;
case '/':
unit.Div(x);
break;
}
}
}
class ChangeSignCommand: Command
{
public ChangeSignCommand(AruthmeticUnit unit): base(unit)
{ }
public override void Execute()
{
unit.Mult(-1);
}
}
class My // Одновременно Client (создает команды и Receiverа) и Invoker (выполняет команды)
{
public static void Main()
{
// Действия Clientа
var unit = new AruthmeticUnit();
var l = new List<Command>();
l.Add(new BinaryCommand(unit,'+',2));
l.Add(new BinaryCommand(unit,'*',3));
l.Add(new BinaryCommand(unit,'-',1));
l.Add(new BinaryCommand(unit,'*',2));
l.Add(new ChangeSignCommand(unit));
// Действия Invokerа
foreach (var c in l)
c.Execute();
Console.WriteLine(unit.Result);
}
}