面向对象设计题目

1.设计步骤

  • step1.分析需求
    谁是使用者,将如何使用。
    5W1H——who what where when why how
  • step2.定义核心对象
  • step3.分析对象关系
  • step4.研究对象的动作

2.设计模式

3.编程题

Q1.请设计用于通用扑克牌的数据结构。并说明你会如何创建该数据结构的子类。实现“二十一点”游戏.

Ans.思路:

Q2.设想你有一个呼叫中心,员工分成三个层级:接线员,主管和经理。客户来电时会先分配给接线员,若接线员处理不了,就必须将来电往上转给主管,若主管无法处理,将来电往上转给经理。请设计这个问题的类和数据结构,并实现一个dispatchCall()方法,将客户来电分给第一个有空的员工。

Ans.思路:

  • Employee抽象类,Director Manager Respondent都继承它
  • Call代表客户来电,每次来电都会有最低层级
  • Callder来电的客户
  • Rank代表层级
  • CallHandler处理电话分发的核心
public class CallHandler {
    private static CallHandler instance;
    
    /* We have 3 levels of employees: respondents, managers, directors. */
    private final int LEVELS = 3; 
    
    /* Initialize with 10 respondents, 4 managers, and 2 directors. */
    private final int NUM_RESPONDENTS = 10;
    private final int NUM_MANAGERS = 4;
    private final int NUM_DIRECTORS = 2;

    /* List of employees, by level.
     * employeeLevels[0] = respondents
     * employeeLevels[1] = managers
     * employeeLevels[2] = directors
     */
    List<List<Employee>> employeeLevels;

    /* queues for each call�s rank */
    List<List<Call>> callQueues; 

    protected CallHandler() {
        employeeLevels = new ArrayList<List<Employee>>(LEVELS);
        callQueues = new ArrayList<List<Call>>(LEVELS); 
        
        // Create respondents.
        ArrayList<Employee> respondents = new ArrayList<Employee>(NUM_RESPONDENTS);
        for (int k = 0; k < NUM_RESPONDENTS - 1; k++) {
            respondents.add(new Respondent());
        }
        employeeLevels.add(respondents);

        // Create managers.
        ArrayList<Employee> managers = new ArrayList<Employee>(NUM_MANAGERS);
        managers.add(new Manager());
        employeeLevels.add(managers);

        // Create directors.
        ArrayList<Employee> directors = new ArrayList<Employee>(NUM_DIRECTORS);
        directors.add(new Director());
        employeeLevels.add(directors);
    }
    
    /* Get instance of singleton class. */
    public static CallHandler getInstance() {
        if (instance == null) {
            instance = new CallHandler();
        }
        return instance;
    }
    
    /* Gets the first available employee who can handle this call. */
    public Employee getHandlerForCall(Call call) {
        for (int level = call.getRank().getValue(); level < LEVELS - 1; level++) {
            List<Employee> employeeLevel = employeeLevels.get(level);
            for (Employee emp : employeeLevel) {
                if (emp.isFree()) {
                    return emp;
                }
            }
        }
        return null;
    }

    /* Routes the call to an available employee, or saves in a queue if no employee available. */
    public void dispatchCall(Caller caller) {
        Call call = new Call(caller);
        dispatchCall(call);
    }
    
    /* Routes the call to an available employee, or saves in a queue if no employee available. */
    public void dispatchCall(Call call) {
        /* Try to route the call to an employee with minimal rank. */
        Employee emp = getHandlerForCall(call);
        if (emp != null) {
            emp.receiveCall(call);
            call.setHandler(emp);
        } else {
            /* Place the call into corresponding call queue according to its rank. */
            call.reply("Please wait for free employee to reply");
            callQueues.get(call.getRank().getValue()).add(call);
        }
    }    

    /* An employee got free. Look for a waiting call that he/she can serve. Return true
     * if we were able to assign a call, false otherwise. */
    public boolean assignCall(Employee emp) {
        /* Check the queues, starting from the highest rank this employee can serve. */
        for (int rank = emp.getRank().getValue(); rank >= 0; rank--) {
            List<Call> que = callQueues.get(rank);
            
            /* Remove the first call, if any */
            if (que.size() > 0) {
                Call call = que.remove(0); 
                if (call != null) {
                    emp.receiveCall(call);
                    return true;
                }
            }
        }
        return false;
    }
}

Q3.运用面向对象原则,设计一款音乐点唱机。

Ans.思路:

  • 系统组件:
    点唱机
    CD
    歌曲
    艺术家
    播放列表
    显示屏
  • 动作:
    新建播放列表
    CD选择器
    歌曲选择器
    将歌曲放进播放列表
    获取播放列表下一首歌曲
  • 还可以引入用户

Q4.运用面向对象原则,设计一个停车场

Ans.思路:

  • 停车场是否是多层的
  • 停车场是否可停多种不同类型的车,并且每种车都有不同大小的停车位
  • 停车规则:是按规定停放?每种车只能停放在相应的停车位中。
  • Vehicle,Car、 Bus和Motocycle继承该类;enum VehicleSize表示车大小
  • Level停车场一层,停车场ParkingLot包含多层Level,也即数组
  • ParkingSpot表示车位大小
public class ParkingLot {
    private Level[] levels;
    private final int NUM_LEVELS = 5;
    
    public ParkingLot() {
        levels = new Level[NUM_LEVELS];
        for (int i = 0; i < NUM_LEVELS; i++) {
            levels[i] = new Level(i, 30);
        }
    }
    
    /* Park the vehicle in a spot (or multiple spots). Return false if failed. */
    public boolean parkVehicle(Vehicle vehicle) {
        for (int i = 0; i < levels.length; i++) {
            if (levels[i].parkVehicle(vehicle)) {
                return true;
            }
        }
        return false;
    }

Q5.请设计在线图书阅读器系统的数据结构

Ans.思路:

  • User Book Libary,UserManager Display(阅读时书籍、用户、页数)
  • 集成类OnlineReaderSystem

Q6.实现一个拼图程序。设计相关数据结构并提供一种拼图算法。假设你有一个fitsWith方法,传入两块拼图,若两块拼图能拼在一起,则返回true。

Ans.思路:

  • 表示块的Piece和其边的Edge(三种类型:平、外凸、内凹),对于Piece的边,可以按三种类型分类,然后给定一边,可以快速找到匹配块
  • 匹配一层一层螺旋地进行

Q7.请描述该如何设计一个聊天服务器。要求给出各种后台组件、类和方法的细节。并说明其中最难解决的问题是什么。

Ans.思路:

  • 添加用户、创建对象、更新状态等;不包括联网、推送数据到客户端
  • 假设好友关系是双向的
  • 实现部分功能:在线离线状态;添加请求(发送、接受、拒绝);私聊和群聊
  • 系统: 数据库 + 客户端 + 服务器;客户端与服务器之间的通信格式
  • User UserManager Conversation(GroupChat PrivateChat) Message

Q8.奥赛罗棋的玩法如下:每一枚棋子的一面为黑,一面为白。游戏双方各执黑、白棋子对决,当一枚棋子的左右或上下同时被对方棋子夹住,这枚棋子就算是被吃掉了,随即翻面为对方棋子的颜色。轮到你落子时,必须至少吃掉对方一枚棋子。任意一方无子可落时,即结束。最后,棋盘上棋子较多的一方获胜。请运用面向对象设计方法,实现。

Ans.思路:

  • 棋子Piece类,用标记指示棋子当前的颜色
  • Board棋盘 只涉及处理落子逻辑处理,分数由棋盘负责;Game游戏 处理计时、游戏流程等
  • 玩家Player
  • 花时间思考,讨论各种做法的优劣:比如 Game是否实现为单例模式;是否需要Game;分数由谁负责等等...

Q9.设计一种内存文件系统的数据结构和算法,并说明具体做法。如有可行,请用代码举例说明。

Ans.思路:

  • 包含File和Directory,Directory包含File和Directory
  • 可以为File和Directory设计一个抽象类Entry

Q10.设计并实现一个散列表,使用链接处理碰撞冲突

Ans.思路:

  • 有几种存储方式:键值分开存储、只存储值、健值封装在一起存储
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容