Design Patterns C# Tutorial

using System;
  public abstract class Job
  {
    protected Job nextJob;
    public abstract void DealWithRequirement(string requirement);
    public void NextInChain(Job next)
    {
      this.nextJob = next;
    }
    
  }
  public class ProgrammerJob: Job
  {
    public override void DealWithRequirement(string requirement)
    {
      switch (requirement)
      {
        case "Code":
          Console.WriteLine ("{0} has managed the code." ,this);
          break;
        default:
          if (nextJob != null)
            nextJob.DealWithRequirement(requirement);
          break;
      }
              
    }
    
    public ProgrammerJob(){;}
  }
  public class Requirement
  {
    public Requirement()
    {
    }
  }
  public class SeniorProgrammerJob: Job
  {
    public override void DealWithRequirement(string requirement)
    {
      switch (requirement)
      {
        default:
          Console.WriteLine("{0} has managed the " + requirement + " requirement." ,this); 
          break;
      }
    }
    public SeniorProgrammerJob(){;}
  }
  public class StaffJob: Job
  {
    public override void DealWithRequirement(string requirement)
    {
      switch (requirement)
      {
        case "Test":
          Console.WriteLine ("{0} has managed the test." ,this);
          break;
        default:
          if (nextJob != null)
            nextJob.DealWithRequirement(requirement);
          break;
      }
              
    }
    public StaffJob(){;}
  }
  class Client
  {
    static void Main(string[] args)
    {
      Job staff = new StaffJob();
      Job manager = new ProgrammerJob();
      Job seniorProgrammer = new SeniorProgrammerJob();
      
      staff.NextInChain(manager);
      manager.NextInChain(seniorProgrammer);
      staff.DealWithRequirement("Plan");
      staff.DealWithRequirement("Test");
      staff.DealWithRequirement("Code");
      staff.DealWithRequirement("Deploy");
    }
  }