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");
}
}