java观察者模式多人上线下线2.0
package org.wangbiao.es.restclient.util.onlin;
import java.util.Observable;
import java.util.Observer;
/**
* 接受者
*/
public class MyObserver implements Observer, Player {
private String name;
public MyObserver(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
if (o instanceof PlayerManagerInstance) {
System.out.println(name + " received news: " + arg);
}
}
@Override
public String getUsername() {
return this.name;
}
@Override
public boolean isOffline() {
return false;
}
}
package org.wangbiao.es.restclient.util.onlin;
import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.ConcurrentHashMap;
/**
* 发布者
*/
public class PlayerManagerInstance extends Observable implements PlayerManager {
public static volatile ConcurrentHashMap<String, Player> hashMap = new ConcurrentHashMap();
public synchronized void addPlayer(Player player) throws InterruptedException {
super.addObserver((Observer) player);
hashMap.put(player.getUsername(), player);
}
public Player getPlayer(String username) {
return hashMap.get(username);
}
@Override
public void sendMsg(String msg) {
setChanged();//标记状态已经改变
notifyObservers(msg);//通知所有观察者,并且传递新闻内容作为参数
}
}
package org.wangbiao.es.restclient.util.onlin;
public interface PlayerManager {
/**
* 增加一个玩家对象。
*/
void addPlayer(Player player) throws InterruptedException;
/**
* 根据用户名获取玩家对象。
*/
Player getPlayer(String username);
void sendMsg(String msg);
}
public interface Player {
/**
* 用户名。
*/
String getUsername();
/**
* 玩家是否掉线。
*/
boolean isOffline();
}
package org.wangbiao.es.restclient.util.onlin;
import lombok.Data;
import java.util.Iterator;
import java.util.Map;
import java.util.Observer;
import java.util.TimerTask;
@Data
public class MyTimeTask extends TimerTask {
private PlayerManagerInstance playerManagerInstance;
private String taskName;
private String userName;
public MyTimeTask(PlayerManagerInstance playerManagerInstance, String taskName) {
this.playerManagerInstance = playerManagerInstance;
this.taskName = taskName;
}
@Override
public void run() {
Iterator<Map.Entry<String, Player>> iterator = PlayerManagerInstance.hashMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Player> next = iterator.next();
Player value = next.getValue();
playerManagerInstance.deleteObserver((Observer) value);
playerManagerInstance.sendMsg(value.getUsername()+"被强制下线了");
iterator.remove();
}
}
}
package org.wangbiao.es.restclient.util.onlin;
import java.util.Timer;
public class PayerTest {
public static void main(String[] args) throws InterruptedException {
PlayerManagerInstance playerManagerInstance = new PlayerManagerInstance();
for (int i = 1; i <= 10; i++) {
MyObserver myObserver = new MyObserver("玩家" + i);
playerManagerInstance.addPlayer(myObserver);
}
playerManagerInstance.sendMsg("欢迎光临!!!");
MyTimeTask myTimeTask = new MyTimeTask(playerManagerInstance, "3333333");
Timer myTimer = new Timer();
myTimer.schedule(myTimeTask, 6000);
}
}
本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18611210

浙公网安备 33010602011771号