1. 程式人生 > >三道關於面向物件設計的面試題

三道關於面向物件設計的面試題

題一

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().

分析一下,我們大概可以確定有如下類:

call 這個類應該有

rank: 這個call的級別

content: 這個call的內容

reply(): 回覆這個call

disconnect():結束通話這個call

employee 這個類有僱員的一般資訊(這裡就不考慮這個了). 同時應該有幾個重要屬性和方法:

rank:僱員可以處理的事物級別。

free:僱員此刻是否空閒。

receiveCall(): 僱員被派發了一個call。

canHandleCall(): 僱員處理一個call。

canNotHandleCall(): 僱員無法處理一個call時。這裡會選擇將call的級別加一,並再次dispatch這個call。

fresher,technicalLead,productMmanager。這3個類應該繼承employee類。其中兩個類可以考慮使用singleton模式保證只能例項化一個例項。

callHandler 這個類應該實現題目中要求的getCallHandler()方法,這個方法返回一個符合要求的僱員。

例項化不同的僱員。

取得一個call

派發一個call,這個方法從getCallHandler()得到一個合適的僱員,並呼叫他的receiveCall()。

public class CallHandler{
    static final int LEVELS = 3;
    static final int NUM_FRESHERS = 5;
    ArrayList<Employee>[] employeeLevels = new ArrayList[LEVELS];
    // queues for each call’s rank
    Queue<Call>[] callQueues = new LinkedList[LEVELS];

    public CallHandler() { ... }

    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) { ... }
        public void disconnect() { ... }
    }

    class Employee {
        CallHandler callHandler;
        int rank; // 0- fresher, - technical lead, - product manager
        boolean free;
        Employee(int rank) { this.rank = rank; }
        void ReceiveCall(Call 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); }
    }


題二

Design the data structures for an online book reader system.

題三
Explain how you would design a chat server. In particular, provide details about the various backend components, classes, and methods. What would be the hardest
problems to solve?

這設計題並不難,需要面試的時候和麵試人溝通,確定更多的細節。這裡我們可以假設

題四

Explain the data structures and algorithms that you would use to design an in-memory !le system. Illustrate with an example in code where possible.

大家先看看,之後再補充答案。



相關推薦

面向物件相關試題

1.面向物件的優點? (1)提高了程式碼的可擴充套件性。 (2)提高了程式碼的可維護性。 (3)面向物件的封裝,繼承,多型。 2. 介面與抽象類的區別? (1)抽象類使用abstract修飾 ,介面使用i

java面向物件試題

1.super()和this()的區別? this():當前類的物件,super父類物件。 super():在子類訪問父類成員和行為,必須承受繼承規則的約束,而this代表當前物件,所有的資源都可以訪問。在建構函式中,如果第一行沒有寫super()

關於面向物件設計試題

題一 Imagine you have a call center with three levels of employees: fresher, technical lead (TL), product manager (PM). There can be multip

章:10C/C++經典試題

面試題 21:談談你對程式設計規範的理解或認識 程式設計規範可總結為:程式的可行性,可讀性、可移植性以及可測試性。 說明:這是程式設計規範的總綱目,面試者不一定要去背誦上面給出的那幾個例子,應該去理解這幾個例子說明的問題,想一想,自己如何解決可行性、可讀性、可移植性以及

分享幾經典的javascript試題

cti function 一點 經典的 bsp log 分享 輸出 for 這幾道題目還是有一點意思的,大家可以研究一番,對自己的技能提升絕對有幫助。 1、調用過程中輸出的內容是什麽 function fun(n, o) { console.log(o);

10典型的JavaScript試題

開發 var int {} 還要 創建 pts 解決 mode 問題1: 作用域(Scope)   考慮以下代碼: (function() { var a = b = 5; })(); console.log(b);   上述代碼會打印出5。這個問題的陷阱就是

合格linux運維人員必會的30shell編程試題及講解-08

數據 實現 腳本 inux mysqld pass shell編程 ldb mysqldump 企業實戰題8:如何實現對MySQL數據庫進行分庫備份,請用腳本實現 我的腳本========================= #!/bin/bash BAKPATH=/ser

(轉)合格linux運維人員必會的30shell編程試題及講解

需要 add 檢查 手工 rip 發送 toa exe 很多 超深度講解shell高級編程實戰,截至目前shell編程課程國內培訓機構最細的課程,不信請看學員表現的水平。 課程牛不牛,不是看老師、課表,而是看培養的的學生水平,目前全免費中夥伴們趕緊看啊。 http://ed

53Java線程試題

模式 port and finall 兩個 必須 hang zed ket 下面是Java線程相關的熱門面試題,你可以用它來好好準備面試。 1) 什麽是線程? 線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。程序員可以通過它進行多處理器

面向對象 試題

nds span 對象 控制 耦合 style 訪問 修飾 面試題 面象對象的三大特征: 繼承:extends    作用:代碼復用、傳遞性。      子類繼承父類的特征和行為。子類可以有父類的方法,屬性(非private)。子類也可以對父類進行擴展,也可以重寫父類的

37WEB前端開發試題之JavaScript篇章!

收集 let 區分 但我 感知 異步編程 firefox 指針 nod ajax, 跨域, jsonp 參考: 《JavaScript》高級程序設計第21章:Ajax和Comet jQuery中Ajax操作 apply和call的用法和區別: 用法: 都能繼承另一個對

面向物件設計原則實踐:之五.迪米特原則,介面隔離原則

六、迪米特(第三者互動)原則 1. 定義 每一個軟體單位對其他的單位都只有最少的知識,而且侷限於那些與本單位密切相關的軟體單位。   2. 分析 1) 迪米特法則就是指一個軟體實體應當儘可能少的與其他實體發生相互作用。 這樣,當一個模組修改時,就會盡量少的影響其他的

面向物件設計原則實踐:之四.里氏代換原則

五、里氏代換原則(LSP--Liskov Substitution Principle) 1. 定義 a). 如果對每一個型別為S的物件o1,都有型別為T的物件o2, 使得以T定義的所有程式P在所有的物件o1都代換成o2時,程式P的行為沒有變化, 那麼型別S是型別T的子型別。 b

面向物件設計原則 開放封閉原則(Open Closed Principle)

開放封閉原則(OCP,Open Closed Principle)是所有面向物件原則的核心。   軟體設計本身所追求的目標就是封裝變化、降低耦合,而開放封閉原則正是對這一目標的最直接體現。 其他的設計原則,很多時候是為實現這一目標服務的,例如以里氏替換原則實現最佳的、正確的繼承層次,就能保證不

面向物件設計原則 依賴倒置原則(Dependency Inversion Principle)

依賴倒置原則(Dependence Inversion Principle)是程式要依賴於抽象介面,不要依賴於具體實現。 簡單的說就是要求對抽象進行程式設計,不要對實現進行程式設計,這樣就降低了客戶與實現模組間的耦合。   面向過程的開發

面向物件設計原則 介面分離原則(Interface Segregation Principle)

介面隔離原則   使用多個專門的介面,而不使用單一的總介面,即客戶端不應該依賴那些它不需要的介面。   從介面隔離原則的定義可以看出,他似乎跟SRP有許多相似之處。 是的其實ISP和SRP都是強調職責的單一性, 介面隔離原則告訴我們在定義介面的時候要根據職責定義“較小”的介面

PHP設計模式:類自動載入、PSR-0規範、鏈式操作、11種面向物件設計模式實現和使用、OOP的基本原則和自動載入配置

一、類自動載入      SPL函式 (standard php librarys)      類自動載入,儘管 __autoload() 函式也能自動載入類和介面,但更建議使用&nbs

海量資料處理試題與十個方法大總結:

轉載之處:http://blog.csdn.net/liuqiyao_01/article/details/26567237 筆試 = (資料結構+演算法) 50%+ (計算機網路 + 作業系統)30% +邏輯智力題10%  + 資料庫5% + 歪門邪道題5%,而面

面向物件設計模式原則

7種常用的面相物件設計原則 單一職責原則(SRP):一個類只負責一個功能領域中的相應指責,就一個類而言,應該只有一個引起它變化的原因(可以實現低耦合,換句話說就是要承擔的責任少,被複用的就頻繁) 開閉原則(OCP):軟體實體對擴充套件開放,對修改關閉。(可以在新增輔助

面向物件設計三大原則

面向物件設計三大原則--->OO設計原則---->設計模式 (封裝變化點,對介面進行程式設計,多使用組合而不是繼承) 該三大原則應該算是OO的基礎,很多OO設計原則和設計模式都是在此三大原則上面衍生髮展而來。所以對於學習設計模式的人,瞭解這三大原則顯然是非常必要的。 &n