最近很多公司面试喜欢问一些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<int> requests;
}
class ElevatorManager
{
public:
void addRequest(int floor){
Request::getInstance().addRequest(floor);
}
};