小小笔试题——企鹅2014校招——简答题——广州
本题来自:http://blog.csdn.net/v_july_v/article/details/11921021
题目描述:请设计一个排队系统,能够让每个进入队伍的用户都能看到自己再队列中所处的位置和变化,队伍可能随时有人加入和退出,当有人退出影响到用户的位置排名时需要及时反馈到用户。
先在对本题进行做如下假设:
1.不存在插队的情况,即新用户只能出现在队伍的末尾
2.本次设计未满足随时有人加入和退出条件,即未满足同一时刻的并发处理
那么对题目进行分析:
第一,用户的关注点有两个:所处位置以及位置是否变化
第二,导致位置的变化是由用户退出所引起的
那么,根据上述的描述,如果让我来作答,会选择设计模式中的Observer(观察者模型)来作答。因为,此场景是一种订阅-推送的场景,可以参考之前我对Observer描述:http://blog.csdn.net/anger_coder/article/details/12292979
那么基于此,分析观察者模式中的角色:
观察者:用户
抽象主题:加入、退出
解释说来,就是用户作为观察者,只关注于自己的位置是否发生变化,这个变化的通知者——系统;那么系统则关心抽象主题,也就是加入、退出。实现的流程就是:观察者加入到系统中,当有关注的事件发生时,系统通知观察者。
下面来看下类图

上述就是实现Observer模型的类定义,按照此思路实现示例Demo(Java版):源码下载地址:TecentObserver
关键代码如下:
测试类代码:
package com.hzy.test;import org.junit.Test;import com.hzy.observer.ConcreteObserver;import com.hzy.observer.ConcreteSubject;public class TecentTest {@Testpublic void test(){ConcreteSubject concreteSubject = new ConcreteSubject();ConcreteObserver concreteObserverOne = new ConcreteObserver( "A" );ConcreteObserver concreteObserverTwo = new ConcreteObserver( "B" );ConcreteObserver concreteObserverThree = new ConcreteObserver( "C" );ConcreteObserver concreteObserverJoin = new ConcreteObserver( "Join" );concreteSubject.Attach( concreteObserverOne );concreteSubject.Attach( concreteObserverTwo );concreteSubject.Attach( concreteObserverThree );concreteSubject.Detach( concreteObserverTwo, 2 );concreteSubject.Attach( concreteObserverJoin );}}思路就写到这里,附带了一个简单的实现,还有很多不完善的地方,如果思路不对,或者有其他好想法,希望大家踊跃发言,集思广益嘛!!:)