一些常见面试OO design题目总结

最近很多公司面试喜欢问一些OO design的题目, 我总结了一些比较高频的题目, 需求不一定准确, 设计的也不一定好, 欢迎提出建议.

 1. 电梯设计

 2. 停车厂设计

 3. 通用卡牌游戏blackjack设计

 4...


1. 电梯设计

需求: 以面向对象的方式设计一个电梯, 包含一些必要的类和函数.

分析: 我的设计分为三个类, 一个是电梯本身的类, 包含一些移动电梯的函数和电梯状态. 另外还有一个update函数会被不停调用, 更新电梯状态. 还有一个请求类, 采用singleton模式, 用于接收用户请求, 和电梯提供给电梯下一个目标楼层, 和删除请求. 还有一个类似user类, 可以使得用户通过这个类提供的接口发出请求.

电梯调度算法采用经典的电梯扫描算法, 在一个方向上完成所有的请求, 然后再改变方向完成另外一个方向的所有请求.

代码如下:

class Elevator
{
public:
    Elevator():direction(0), curFloor(1){}
    void moveUp() { curFloor++; }
    void moveDown() { curFloor--; }
    void stop() { }
    void openDoor() {  }
    void closeDoor() { }
    void update()
    {
        int target = Request::getInstance().getNextFloor(curFloor, direction);     
        if(target == curFloor && direction==0) return;
        if(target > curFloor){
            direction = 1;
            moveUp();
        }
        else if(target < curFloor){
            direction = -1;
            moveDown();
        }
        if(target == curFloor){
            openDoor();
            closeDoor();
            direction = 0;
            stop();
            return;
        }
    }

private:
    int direction;
    int curFloor;
};


class Request
{
public:
    static Request& getInstance(){
        static Request intance;
        return instance;
    } 

    int getNextFloor(int curFloor, int dir){
        if(requests.size()==0) return curFloor;
        if(dir>=0) return *requests.rbegin();
        return *requests.begin();
    }

    void addRequest(int floor){
        requests.insert(floor);
    }

    void removeRequest(int floor){
        requests.erase(floor);
    }
    
private:
    set requests;
}

class ElevatorManager 
{
public:
    void addRequest(int floor){
        Request::getInstance().addRequest(floor);
    }
};



你可能感兴趣的:(设计模式,OOD,设计,OOD)