观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化,所有依赖于它的对象都能得到通知,其实就是发布/订阅的关系。
LOL游戏中有两个队列,一个普通用户列表,一个VIP用户列表
public class Lol {
private List<User> normalUser
= new ArrayList<>();
private List<User> vipUser
= new ArrayList<>();
/**
* 发送给普通玩家的信息
*/
private String normalUserMessage;
/**
* 发送给Vip玩家的信息
*/
private String vipUserMessage;
/**
* 添加一个普通用户
* @param user 用户
*/
public void attachNormalUser(User user){
normalUser.add(user);
}
/**
* 添加一个VIP用户
* @param user 用户
*/
public void attachVipUser(User user){
vipUser.add(user);
}
public String getNormalUserMessage() {
return normalUserMessage;
}
public String getVipUserMessage() {
return vipUserMessage;
}
/**
* 通知所有Vip用户
* @param vipUserMessage 给Vip用户的信息
*/
public void notifyAllVipUser(String vipUserMessage){
this.vipUserMessage = vipUserMessage;
for(User user:vipUser){
user.notifyNewMessage();
}
}
/**
* 通知所有普通用户
* @param normalUserMessage 给普通用户的信息
*/
public void notifyAllNormalUser(String normalUserMessage){
this.normalUserMessage = normalUserMessage;
for(User user:normalUser){
user.notifyNewMessage();
}
}
/**
* 通知所有用户
* @param allUserMessage 给所有用户的信息
*/
public void notifyAllUser(String allUserMessage) {
this.notifyAllNormalUser(allUserMessage);
this.notifyAllVipUser(allUserMessage);
}
}
public abstract class User {
protected String username;
protected Lol lol;
public abstract void notifyNewMessage();
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
public class VipUser extends User{
public VipUser(Lol lol,String username){
this.username = username;
this.lol = lol;
this.lol.attachVipUser(this);
}
@Override
public void notifyNewMessage() {
System.out.println(username+"收到:"+lol.getVipUserMessage());
}
}
public class NormalUser extends User {
public NormalUser(Lol lol,String username){
this.username = username;
this.lol = lol;
this.lol.attachNormalUser(this);
}
@Override
public void notifyNewMessage() {
System.out.println(username+"收到:"+lol.getNormalUserMessage());
}
}
public class TestObserver {
public static void main(String[] args){
Lol lol = new Lol();
new NormalUser(lol,"李*阳");
new NormalUser(lol,"李*勇");
new VipUser(lol,"问*龙");
new VipUser(lol,"李*娟");
lol.notifyAllNormalUser("给普通用户的信息");
lol.notifyAllVipUser("给Vip用户的信息");
lol.notifyAllUser("给所有用户的信息");
}
}