Call Center

Imagine you have a call center with three levels of employee: respondent, manager, and director. An incoming telephone call must be first allocated to a respondent who is free. If the respondent can't handle the call, he or she must escalate the call to a manager. If the manager is not free or not able to handle it, then the call should be escalated to a director. Design the classes and data structures for this problem. Implement a method dispatchCall() which assigns a call to the first available employee.


Details can be seen in the code:

public class CallHandler{
    private final int LEVELS = 3;
    private final int NUM_RESPONDENTS = 10;
    private final int NUM_MANAGERS = 4;
    private final int NUM_DIRECTORS = 2;
    List<List<Employee>> employeeLevels;
    List<List<Call>> callQueues;
    public void dispatchCall(Caller caller){
        Call call = new Call(caller);
    public void dispatchCall(Call call) {
        Employee emp = getHandlerForCall(call);
        if (emp != null){
        } else {

public class Call{
    private Rank rank;
    private Caller caller;
    private Employee handler;
    public Call(Caller c){
        rank = Rank.Responder;
        caller = c;
    public void setHandler(Employee e) { handler = e; }
    public void reply(String message) {...}
    public Rank getRank() { return rank; }
    public Rank incrementRank() { ... }
    public void disconnect() {...}

abstract class Employee{
    private Call currentCall = null;
    protected Rank rank;
    public Employee(CallHandler handler) {...}
    public void receiveCall(Call call) {...}
    public void callCompleted() {...}
    public escalateAndReassign() {...}
    public boolean assignNewCall() {...}
    public boolean isFree() { return currentCall == null; }
    public Rank getRank() { return rank; }

class Director extends Employee {
    public Director() {
        rank = Rank.Director;

class Manager extends Employee {
    public Manager() {
        rank = Rank.Manager;

class Respondent extends Employee {
    public Respondent() {
        rank = Rank.Respondent;