The Fake Geek's blog: Design a Call Center
Imagine you have a call center with three levels of employees: fresher, technical lead (TL), product manager (PM).There can be multiple employees, but only one TL or PM.An incoming telephone call must be allocated to a fresher who is free.
If a fresher can't handle the call, he or she must escalate the call to technical lead.If the TL is not free or not able to handle it, then the call should be escalated to PM.Design the classes and data structures for this problem.Implement a method getCallHandler().
https://tianrunhe.wordpress.com/2012/03/18/design-the-classes-and-data-structures-for-a-call-center/
Imagine you have a call center with three levels of employees: fresher, technical lead (TL), product manager (PM).There can be multiple employees, but only one TL or PM.An incoming telephone call must be allocated to a fresher who is free.
If a fresher can't handle the call, he or she must escalate the call to technical lead.If the TL is not free or not able to handle it, then the call should be escalated to PM.Design the classes and data structures for this problem.Implement a method getCallHandler().
https://tianrunhe.wordpress.com/2012/03/18/design-the-classes-and-data-structures-for-a-call-center/
The way of handling abilities to handle the call is implemented by matching employee’s level and call’s level.
Escalation is implemented by increment of the level of the call.
Read full article from The Fake Geek's blog: Design a Call Center
Escalation is implemented by increment of the level of the call.
public
class
CallHandler {
static
final
int
LEVELS =
3
;
// we have 3 levels of employees
static
final
int
NUM_FRESHERS =
5
;
// we have 5 freshers
ArrayList<Employee>[] employeeLevels =
new
ArrayList[LEVELS];
// queues for each call’s rank
Queue<Call>[] callQueues =
new
LinkedList[LEVELS];
public
CallHandler() {
// constructor
}
Employee getCallHandler(Call call) {
for
(
int
level = call.rank; level < LEVELS -
1
; level++) {
ArrayList<Employee> employeeLevel = employeeLevels[level];
for
(Employee emp : employeeLevel) {
if
(emp.free) {
return
emp;
}
}
}
return
null
;
}
// routes the call to an available employee, or adds to a queue
void
dispatchCall(Call call) {
// try to route the call to an employee with minimal rank
Employee emp = getCallHandler(call);
if
(emp !=
null
) {
emp.ReceiveCall(call);
}
else
{
// place the call into queue according to its rank
callQueues[call.rank].add(call);
}
}
void
getNextCall(Employee e) {
// look for call for e’s rank
}
}
class
Call {
int
rank =
0
;
// minimal rank of employee who can handle this call
public
void
reply(String message) {
// reply
}
public
void
disconnect() {
// disconnect
}
}
class
Employee {
CallHandler callHandler;
int
rank;
// 0- fresher, 1 - technical lead, 2 - product manager
boolean
free;
Employee(
int
rank) {
this
.rank = rank;
}
void
ReceiveCall(Call call) {
// receive call
}
void
CallHandled(Call call) {
// call is complete
}
void
CannotHandle(Call call) {
// escalate call
call.rank = rank +
1
;
callHandler.dispatchCall(call);
free =
true
;
callHandler.getNextCall(
this
);
// look for waiting call
}
}
class
Fresher
extends
Employee {
public
Fresher() {
super
(
0
);
}
}
class
TechLead
extends
Employee {
public
TechLead() {
super
(
1
);
}
}
class
ProductManager
extends
Employee {
public
ProductManager() {
super
(
2
);
}
}