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);
    }
}

 

posted @ 2024-12-16 21:59  余生请多指教ANT  阅读(10)  评论(0)    收藏  举报