Chain of Responsibility Pattern

image_pdfimage_print
   
 

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