PatternsCSharpExtraAddons/Patterns/Pattern_7-Команда/Program.cs
Dvurechensky a4cd4b4ced 1.0
Main
2024-10-05 09:30:14 +03:00

129 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* ПАТТЕРНЫ ПОВЕДЕНИЯ
*
* Глава_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}");
}
}
/// <summary>
/// Проверить факт выполнения операции
/// IOperation - единственный ответственный за действие
/// </summary>
interface IOperation
{
void Execute();
public bool IsComplete { get; }
}
/// <summary>
/// Шаблон команды пополнения кошелька
/// </summary>
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;
}
/// <summary>
/// Обработка выполения команды
/// </summary>
public void Execute()
{
accaunt.Balance += money;
isComplete = true;
}
}
/// <summary>
/// Команда снятия с кошелька
/// </summary>
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;
}
/// <summary>
/// Обработка выполения команды
/// </summary>
public void Execute()
{
if (accaunt.Balance - money < 0) return;
accaunt.Balance -= money;
isComplete = true;
}
}
/// <summary>
/// коллекция команд
/// </summary>
class Operations : Collection<IOperation> { }
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();
}
}