请设计一个排序系统,能让每个排队的用户,都能看到自己在队列中所处的位置和变化,队列有人随时有可能加入和退出,当有人退出影响到自己的位置的时需要及时反馈到用户。
//观察者设计模式
//队列为被观察者,人为观察者
//当有人离开,通知所有在队列里的人
//用两个线程模拟入队,跟有人离开
package 队列系统线程;
import java.util.ArrayList;
public class Main {
//观察者
public static class Person{
public String name;
public Person(String name) {
this.name = name;
}
public void listChange(int i){
System.out.println(name+"当前位置为:"+i);
}
}
//被观察者
public static class ObjectiveList{
public static ArrayList<Person> list;
public ObjectiveList(){
this.list = new ArrayList<>();
}
//增加到队尾
public synchronized void addPerson(Person person){
System.out.println(person.name+"加入队伍!");
list.add(person);
}
//当前面的有人离开,通知所有人当前位置
public synchronized void removePerson(int i){
System.out.println(list.get(i).name+"离开队伍!");
list.remove(i);
for(int j=0;j<list.size();++j){
list.get(j).listChange(j);
}
}
public int getPersonSize(){
return list.size();
}
}
//有人加入,入队进程
public static class ObjListAddPersonThread extends Thread{
public ObjectiveList list;
public ObjListAddPersonThread(ObjectiveList list) {
this.list = list;
}
@Override
public void run() {
int i=0;
while(true){
list.addPerson(new Person("name"+i++));
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
//有人离开,位置发生改变进程
public static class ObjListRemovePersonThread extends Thread{
public ObjectiveList list;
public ObjListRemovePersonThread(ObjectiveList list) {
this.list = list;
}
@Override
public void run() {
int j=0;
while(true){
if(list.getPersonSize()==0){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
continue;
}
list.removePerson(j++%list.getPersonSize());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
ObjectiveList objectiveList = new ObjectiveList();
ObjListAddPersonThread objListAddPersonThread = new ObjListAddPersonThread(objectiveList);
ObjListRemovePersonThread objListRemovePersonThread = new ObjListRemovePersonThread(objectiveList);
objListAddPersonThread.start();
objListRemovePersonThread.start();
}
} Test.java
import java.util.ArrayList;
public class Test {
/*请设计一个排序系统,能让每个排队的用户,都能看到自己在队列中所处的位置和变化,
* 队列有人随时有可能加入和退出,当有人退出影响到自己的位置的时需要及时反馈到用户。
* 思路:用JDk内置的Observer接口和Observable类完成观察者模式
* 用户为观察者,系统为被观察者,另外添加删除的同时用ArrayList来储存User,以便于获取位置
*/
final static int addCode=0;
final static int removeCode=1;
static ArrayList<User> ulist=new ArrayList<>();
static QueueSystem qs=new QueueSystem();
public void addUser(User u){
ulist.add(u);
qs.addObserver(u);
}
public void removeUser(User u){
ulist.remove(u);
qs.deleteObserver(u);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
User u1=new User(ulist);
User u2=new User(ulist);
Test t = new Test();
t.addUser(u1);
t.addUser(u2);
qs.somethingChange();
}
}
User.java
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
public class User implements Observer{
private int position;
private ArrayList<User> ulist;
public User(ArrayList<User> list){
this.ulist=list;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
position=ulist.indexOf(this);
System.out.println(arg+"your position is "+position);
}
}
QueueSystem
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
public class QueueSystem extends Observable{
public void somethingChange(){
setChanged();
notifyObservers("队列变化!");
}
}
import java.util.ArrayList;
import java.util.List;
final class WaitSystem {
//正在排队的用户
private List<AbstractUser> waitingUsers = new ArrayList<>();
/**
* 加入排队的用户
*
* @param user
* @return
*/
public synchronized int addUser(AbstractUser user) {
if (user == null) {
throw new NullPointerException();
}
user.setPosition(waitingUsers.size() + 1);
waitingUsers.add(user);
return user.getPosition();
}
/**
* 移除用户
*
* @param user
*/
public synchronized void removeUser(AbstractUser user) {
if (user == null) {
throw new NullPointerException();
}
if (!waitingUsers.remove(user)) {
return;
}
//获得user之前在队列中的位置, 后面的用户位置减一
int pos = user.getPosition() - 1;
for (int i = pos; i < waitingUsers.size(); i++) {
waitingUsers.get(i).setPosition(i + 1);
waitingUsers.get(i).onStatusChanged();
}
}
}
abstract class AbstractUser {
protected int position;
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
abstract void onStatusChanged();
}
class User extends AbstractUser {
public void onStatusChanged() {
System.out.println("my position is " + position);
}
} import java.util.LinkedList;
/**
* Created by WZW on 2017/08/08.
* 请设计一个排序系统,能让每个排队的用户,
* 都能看到自己在队列中所处的位置和变化,
* 队列有人随时有可能加入和退出,
* 当有人退出影响到自己的位置的时需要及时反馈到用户
*/
public class PaiDuiSystem {
public static void main(String args[]){
QueueSystem queueSystem=new QueueSystem();
People people=new People(queueSystem);
People people1=new People(queueSystem);
People people2=new People(queueSystem);
people1.InQueue();
people2.InQueue();
people.InQueue();
people1.PrintNow();
people1.outQueue();
}
}
class QueueSystem{
LinkedList<People> list=new LinkedList<>();
//入队
public synchronized int InQueue(People people){
this.list.addLast(people);
return list.size();
}
//出队
public void OutQueue(People people){
int index=list.indexOf(people);
if(index<0) {
System.out.println("您不在队中");
}else{
//提示后续的人
synchronized (this) {
list.remove(index);
for(int i=index;i<list.size();i++){
list.get(i).PrintChange(i+1);
}
}
}
}
//获得当前位置
public int getNow(People people){
return list.indexOf(people);
}
}
class People{
QueueSystem queueSystem;
public People(QueueSystem queueSystem){
this.queueSystem=queueSystem;
}
//入队
public void InQueue(){
int index=queueSystem.InQueue(this);
System.out.println("我入队了,当前位置:"+index);
}
//出队
public void outQueue(){
queueSystem.OutQueue(this);
}
//当前位置
public void PrintNow(){
int index=queueSystem.getNow(this);
if(index<0){
System.out.println("您当前不在队中");
}else{
System.out.println("我的当前位置:"+(index+1));
}
}
//如果有改动
public void PrintChange(int index){
System.out.println("有人出队,我的当前位置为:"+index);
}
}