Команда (Command) — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (→Пример) |
Admin (обсуждение | вклад) (→Пример) |
||
Строка 18: | Строка 18: | ||
=== Пример === | === Пример === | ||
+ | [http://pascalabc.net/WDE/?file=PatternsCS/CalcCommand.cs Этот пример в WDE] | ||
<source lang="Csharp"> | <source lang="Csharp"> | ||
using System; | using System; |
Версия 22:03, 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);
}
}