using System; public abstract class Chain { protected Chain theNextInChain; public abstract void DealWithRequirement(string requirement); public void NextInChain(Chain next) { this.theNextInChain = next; } } public class Employee : Chain { public override void DealWithRequirement(string requirement) { switch (requirement) { case "Job": Console.WriteLine("{0} Staff", this); break; default: if (theNextInChain != null) theNextInChain.DealWithRequirement(requirement); break; } } } public class Manager : Chain { public override void DealWithRequirement(string requirement) { switch (requirement) { case "Manager": Console.WriteLine("{0} requirement.", this); break; default: if (theNextInChain != null) theNextInChain.DealWithRequirement(requirement); break; } } } public class Senior : Chain { public override void DealWithRequirement(string requirement) { switch (requirement) { default: Console.WriteLine("{0} has managed the " + requirement + " requirement.", this); break; } } public Senior() { ;} } class Client { static void Main(string[] args) { Chain staff = new Employee(); Chain manager = new Manager(); Chain seniorManager = new Senior(); staff.NextInChain(manager); manager.NextInChain(seniorManager); staff.DealWithRequirement("Corporates"); staff.DealWithRequirement("Job"); staff.DealWithRequirement("Manager"); staff.DealWithRequirement("Agency"); } }