Careercup | Chapter 8

8.2 Imagine you have a call center with three levels of employees: 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 notable to handle it, then the call should be escalated to a director. Design the classes and data structures for this problem. Implement a method dispatchCaL L () which assigns a call to the first available employee

 1 struct Call {
 2     string phoneNumber;
 3     string content;
 4 };
 5 enum RANK {
 6 RESPONDENT, MANAGER, DIRECTOR
 7 };
 8 class Employee {
 9 public:
10     Employee(int level) : level(level) {}
11     int getLevel() const { return level; }
12     bool isFree() const { return calls.empty(); }
13     virtual bool handleCall(Call call) = 0;
14 protected:
15     queue<Call> calls;
16 private:
17     int level;
18 };
19 
20 class Respondent : public Employee {
21 public:
22     Respondent() : Employee(RANK::RESPONDENT) {}
23     bool handleCall(Call call) { /*...*/ return true;}
24 };
25 
26 class Manager: public Employee {
27 public:
28     Manager() : Employee(RANK::MANAGER) {}
29     bool handleCall(Call call) { /*...*/ return true;}
30 };
31 
32 class Director : public Employee {
33 public:
34     Director(): Employee(RANK::DIRECTOR) {}
35 bool handleCall(Call call) {/*...*/ return true; }    
36 };
37 
38 class CallCenter {
39 public:
40     bool dispatchCall(Call call) {
41         for (map<int, vector<Employee> >::iterator it = employees.begin();
42             it != employees.end(); it++) {
43             for (int i = 0; i < it->second.size(); ++i) {
44                 if (it->second[i].isFree() && it->second[i].handleCall(call)) {
45                     return true;
46                 }
47             }
48         }
49         return false;
50     }
51 
52     void addEmployee(Employee &employee) {
53         employees[employee.getLevel()].push_back(employee);
54 }
55 private:
56     map<int, vector<Employee> > employees;
57 };
原文地址:https://www.cnblogs.com/linyx/p/3970776.html