I'm having some questions on creating a design for simple approval workflow. Some arbitrary thing (ItemToApprove) needs approval process. Approval process begins with creating ApprovalRoute which contains several approval steps (ApprovalStep). ItemToApprove goes sequentially through all steps until gets status Approved. On each step there are several Approvers with equal priority. If one approver approves item, step becomes Approved.public class ApprovalRoute{    private LinkedList<ApprovalStep> _approvalSteps;    private ApprovalStep _currenStep;    public bool? Approved { get; private set; }    public void Approve(Approver approver)    {        // ... some cheks if already approved etc        _currentStep.Approve(approver);        if (_currentStep.Approved == true)        {            MoveToNextStep(); // changes _currentStep        }        if (AllStepsApproved()) {           Approved = true;        }    }}public class ApprovalStep{    public bool? Approved { get; private set; }    private List<Approver> _approvers;     public ApprovalStep(List<Approver> approvers)    {        _approvers = approvers;    }    public void Approve(Approver approver)    {        if (_approvers.Contains(approver))        {            Approved = true;        }    }}public class ItemToApprove{    public bool? Approved { get; private set; }    private ApprovalRoute _approvalRoute;    public void StartApprovalWorkflow(ApprovalRoute route)    {        _approvalRoute = route;    }    public void Approve(Approver approver)    {        _approvalRoute.Approve(approver);        if (_approvalRoute.Approved == true)        {            Approved = true;        }    }}public class Approver{    public string Name { get; private set; }    public Approver(string name)    {        Name = name;    }    // ... ovveriding Equals etc}So some console client would be like this      var itemToApprove = new ItemToApprove();      var aprovalRoute = new ApprovalRoute(new ApprovalStep(new List<Approver>      {          new Approver(One),          new Approver(Neo),      });      itemToApprove.StartApprovalWorkflow(aprovalRoute);      while (itemToApprove.Approved == null)      {          Console.Write(Your name: );          string approverName = Console.ReadLine();          itemToApprove.Approve(new Approver(approverName));      }I thik this design has some smell because calling Approve delegates further down to ApprovalStep. The second smell I feel more naturally call Approve on Approver passing ItemToApprove// ....var approver = new Approver();approver.Approve(itemToApprove);What do you think?  
Class responsibilities OOP design
c#;object oriented;classes