using System.Collections.Generic;
public int Id { get; private set; }
public string Name { get; private set; }
public Employee(int id, string name)
public class Manager: Employee
public List<Employee> Employees { get; }
public Manager(int id, string name) : base(id, name)
public interface IManagerEmployeeRepository
void AddEmployee(int managerId, Employee employee);
void RemoveEmployee(int managerId, Employee employee);
bool HasEmployee(int managerId, Employee employee);
public class ManagerEmployeeRepository: IManagerEmployeeRepository
private List<Manager> _managers = new()
new Manager(101, "Serge"),
new Manager(102, "Betty")
public void AddEmployee(int managerId, Employee employee)
_managers.FirstOrDefault(m => m.Id == managerId).Employees.Add(employee);
public void RemoveEmployee(int managerId, Employee employee)
_managers.FirstOrDefault(m => m.Id == managerId).Employees.Remove(employee);
public bool HasEmployee(int managerId, Employee employee)
return _managers.FirstOrDefault(m => m.Id == managerId)?.Employees.Any(e => e.Id == employee.Id) ?? false;
foreach(var manager in _managers)
Console.WriteLine($"Manager {manager.Name}:");
foreach(var employee in manager.Employees)
Console.WriteLine($"\tEmployee {employee.Name}");
public interface ICommand
public class AddEmployeeToManagerCommand: ICommand
private Employee _employee;
private IManagerEmployeeRepository _repository;
public AddEmployeeToManagerCommand(int managerId, Employee employee, IManagerEmployeeRepository repository)
_repository = repository;
if(_employee == null) return false;
if(_repository.HasEmployee(_managerId, _employee)) return false;
if(_employee == null) return;
_repository.AddEmployee(_managerId, _employee);
if(_employee == null) return;
_repository.RemoveEmployee(_managerId, _employee);
public class CommandManager
private Stack<ICommand> _commands = new();
public void Invoke(ICommand command)
if(command != null && command.CanExecute())
Console.WriteLine("Exec");
public static void Main()
CommandManager cmdMng = new();
ManagerEmployeeRepository repository = new();
Console.WriteLine("Initial:");
cmdMng.Invoke(new AddEmployeeToManagerCommand(101, new Employee(201, "Tom"), repository));
cmdMng.Invoke(new AddEmployeeToManagerCommand(102, new Employee(202, "Mark"), repository));
cmdMng.Invoke(new AddEmployeeToManagerCommand(101, new Employee(203, "Alice"), repository));
Console.WriteLine("\nAdded 3 employees:");
cmdMng.Invoke(new AddEmployeeToManagerCommand(102, new Employee(202, "Mark"), repository));
Console.WriteLine("\nAdded Mark the 2nd time:");
Console.WriteLine("\nUndid the last command:");
Console.WriteLine("\nUndid the all commands:");