观察者模式

Posted xiaobo520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。

观察者模式就是在对象之间定义了一对多的依赖,这样一来,当一个这个对象改变状态,依赖它的对象会收到通知并发生改变并自动更新

其实也就是发布-订阅模式,发布者发布消息,订阅者获取消息,没订阅就不会收到消息

这里我们模仿一下微信公众号的推送消息

 

//观察者接口  
public interface Observerable {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObserver();
}


//被观察者接口
public interface Observer {
    void update(String message);
}



//模仿微信公众号
import java.util.ArrayList;
import java.util.List;

public class WechatServer implements Observerable{

    private List<Observer> list;
    private String message;

    public WechatServer() {
        list=new ArrayList<Observer>();
    }

//用户订阅微信公众号
    @Override
    public void registerObserver(Observer observer) {
        list.add(observer);
    }

//用户取消关注
    @Override
    public void removeObserver(Observer observer) {
        if (!list.isEmpty()){
            list.remove(observer);
        }
    }

//给全体订阅者发送消息,通过遍历
    @Override
    public void notifyObserver() {
        for (int i=0;i<list.size();i++){
            Observer observer=list.get(i);
            observer.update(message);
        }
    }

//选择发布什么消息
    public void setInformation(String s){
        this.message=s;
        System.out.println("微信更新消息:"+s);
        notifyObserver();
    }

}




//用户
public class User implements Observer{

    private String name;

    public User(String name) {
        this.name = name;
    }

    public void read(String message){
        System.out.println(name+"收到微信推送的消息为:"+message);
    }

    @Override
    public void update(String message) {
        read(message);
    }
}

  

接下来测试一下

public class Test {
    public static void main(String[] args) {
        WechatServer wechatServer=new WechatServer();

        Observer one=new User("刘一");
        Observer two=new User("王二");
        Observer three=new User("张三");

        wechatServer.registerObserver(one);
        wechatServer.registerObserver(two);
        wechatServer.registerObserver(three);

        wechatServer.setInformation("今天放假");
        System.out.println("==============此时李三取消了微信关注");
        wechatServer.removeObserver(three);
        wechatServer.setInformation("搞错了,不放假,快回来");
        wechatServer.setInformation("通知,李三无故缺席,已被开除,望其他同事引以为戒");

    }
}

  

技术图片

 

以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

未调用 LiveData 观察者

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

如何为片段设置观察者

永远观察实时数据的片段

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式