/*
* ПАТТЕРНЫ ПОВЕДЕНИЯ
*
* Глава_7_1: Команда
*
* - конкретное действие представить в виде конкретного объекта
*/
using System.Collections.ObjectModel;
class Accaunt
{
public string AccauntOwner { get; set; }
public int Balance { get; set; }
public Accaunt(string accauntOwner, int balance)
{
Balance = balance;
AccauntOwner = accauntOwner;
}
public void Info()
{
Console.WriteLine($"{AccauntOwner}: ${Balance}");
}
}
///
/// Проверить факт выполнения операции
/// IOperation - единственный ответственный за действие
///
interface IOperation
{
void Execute();
public bool IsComplete { get; }
}
///
/// Шаблон команды пополнения кошелька
///
class Deposit : IOperation
{
private readonly Accaunt accaunt;
private readonly int money;
private bool isComplete;
public bool IsComplete { get => isComplete; }
public Deposit(Accaunt accaunt, int money)
{
this.accaunt = accaunt;
this.money = money;
isComplete = false;
}
///
/// Обработка выполения команды
///
public void Execute()
{
accaunt.Balance += money;
isComplete = true;
}
}
///
/// Команда снятия с кошелька
///
class Withdraw : IOperation
{
private readonly Accaunt accaunt;
private readonly int money;
private bool isComplete;
public bool IsComplete { get => isComplete; }
public Withdraw(Accaunt accaunt, int money)
{
this.accaunt = accaunt;
this.money = money;
isComplete = false;
}
///
/// Обработка выполения команды
///
public void Execute()
{
if (accaunt.Balance - money < 0) return;
accaunt.Balance -= money;
isComplete = true;
}
}
///
/// коллекция команд
///
class Operations : Collection { }
class OperationManager
{
static public OperationManager Instance;
static OperationManager() => Instance = new OperationManager();
private Operations transactions;
private OperationManager() => transactions = new Operations();
public void AddOperation(IOperation operation) => transactions.Add(operation);
public void ProcessOperations()
{
transactions.Where(op => !op.IsComplete)
.ToList()
.ForEach(op => op.Execute());
}
}
class Program
{
public static void Main()
{
Accaunt accaunt = new Accaunt("nik", 1000);
accaunt.Info();
new Deposit(accaunt, 1000).Execute();
accaunt.Info();
var manager = OperationManager.Instance;
manager.AddOperation(new Deposit(accaunt, 1000));
manager.AddOperation(new Deposit(accaunt, 1000));
manager.AddOperation(new Withdraw(accaunt, 100));
accaunt.Info();
manager.ProcessOperations();
accaunt.Info();
}
}