• 《Cracking the Coding Interview》——第8章:面向对象设计——题目2


    2014-04-23 17:45

    题目:假设有个呼叫中心,有接线员、经理、主管三种角色。如果接线员无法处理呼叫,就上传给经理;如果仍无法处理,则上传给主管。请用代码描述这一过程。

    解法:第一眼觉得这题肯定是在考察设计模式,很像exception的throw过程。对于我这种对设计模式一窍不通的人,这题还无法很好解答。待稍后专门学习设计模式之后,再回来好好琢磨一遍。

    代码:

      1 // 8.2 Design a call center system to handle calls, the order will be respondent->manager->director, find the first employee to handle a call.
      2 #include <iostream>
      3 #include <vector>
      4 using namespace std;
      5 
      6 class People {
      7 public:
      8     People() {};
      9     virtual void handle() = 0;
     10     virtual ~People() {};
     11 };
     12 
     13 class Respondent: public People {
     14 public:
     15     Respondent() {};
     16     void handle() {
     17         cout << "Respondent is handling the call." << endl;
     18     };
     19     ~Respondent() {};
     20 };
     21 
     22 class Manager: public People {
     23 public:
     24     Manager() {};
     25     void handle() {
     26         cout << "Manager is handling the call." << endl;
     27     };
     28     ~Manager() {};
     29 };
     30 
     31 class Director: public People {
     32 public:
     33     Director() {};
     34     void handle() {
     35         cout << "Director is handling the call." << endl;
     36     };
     37     ~Director() {};
     38 };
     39 
     40 class CallCenter {
     41 public:
     42     CallCenter(int num_respondent = 0, int num_manager = 0, int num_director = 0) {
     43         respondents.resize(num_respondent);
     44         managers.resize(num_manager);
     45         directors.resize(num_director);
     46         respondents_available.resize(num_respondent);
     47         managers_available.resize(num_manager);
     48         directors_available.resize(num_director);
     49         fill(respondents_available.begin(), respondents_available.end(), true);
     50         fill(managers_available.begin(), managers_available.end(), true);
     51         fill(directors_available.begin(), directors_available.end(), true);
     52     }
     53     
     54     void handle() {
     55         size_t i;
     56         
     57         for (i = 0; i < respondents.size(); ++i) {
     58             if (respondents_available[i]) {
     59                 break;
     60             }
     61         }
     62         if (i < respondents.size()) {
     63             respondents_available[i] = false;
     64             respondents[i].handle();
     65             respondents_available[i] = true;
     66             return;
     67         }
     68 
     69         for (i = 0; i < managers.size(); ++i) {
     70             if (managers_available[i]) {
     71                 break;
     72             }
     73         }
     74         if (i < managers.size()) {
     75             managers_available[i] = false;
     76             managers[i].handle();
     77             managers_available[i] = true;
     78             return;
     79         }
     80         
     81         for (i = 0; i < directors.size(); ++i) {
     82             if (directors_available[i]) {
     83                 break;
     84             }
     85         }
     86         if (i < directors.size()) {
     87             directors_available[i] = false;
     88             directors[i].handle();
     89             directors_available[i] = true;
     90             return;
     91         }
     92     }
     93 private:
     94     vector<Respondent> respondents;
     95     vector<Manager> managers;
     96     vector<Director> directors;
     97     vector<bool> respondents_available;
     98     vector<bool> managers_available;
     99     vector<bool> directors_available;
    100 };
    101 
    102 int main()
    103 {
    104     CallCenter *p_call_center = nullptr;
    105     int r, m, d;
    106     
    107     while (cin >> r >> m >> d) {
    108         p_call_center = new CallCenter(r, m, d);
    109         p_call_center->handle();
    110         delete p_call_center;
    111         p_call_center = nullptr;
    112     }
    113     
    114     return 0;
    115 }
  • 相关阅读:
    c# 系统校时工具类
    c# 字符串工具类
    c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)
    c# 获取随机数字/字符/时间
    c# 汉字转拼音
    c# 获取机器硬件信息 (硬盘,cpu,内存等)
    c# 实体处理工具类
    Ubuntu 查看和杀死进程
    shell 脚本杀死后台由php脚本控制运行的所有php脚本和java程序
    【Shell脚本】怎样表示一个for循环
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3683530.html
Copyright © 2020-2023  润新知