观察者

Updated on in 程序人生 with 0 views and 0 comments

1、简介

观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化,所有依赖于它的对象都能得到通知,其实就是发布/订阅的关系。

2、建立LOL游戏(发布者)

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

3、建立用户抽象(订阅者)

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

4、建立VIP用户

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

5、建立普通用户

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

6、测试发布信息

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("给所有用户的信息");
    }
}

标题:观察者
作者:wenyl
地址:http://www.wenyoulong.com/articles/2020/12/23/1608706624373.html