zl程序教程

您现在的位置是:首页 >  工具

当前栏目

用微信公众号理解观察者模式

微信模式 理解 公众 观察者
2023-09-27 14:28:04 时间

作者:夏至,欢迎转载,但请保留这段申明,谢谢。
http://blog.csdn.net/u011418943/article/details/78008102

1、什么是观察者模式

定义对象间的一种 一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于她的对象都得到通知并被自动更新
其中,订阅者我们称为 Observer,多个观察者的对象额比称为 Subject。

结构说明:

  • Subject :目标对象,通常具有如下功能:
  • 一个目标可以被多个观察者观察
  • 目标提供对观察者的注册和退订的维护
    当目标的状态发生改变时,通知所有注册的,有效的观察者

2、于接口定义的区别

相信很多人看到这里就会想说,跟接口不是差不多吗?是的,接口是一对一,而观察者则是一对多的关系,所以这点没啥好纠结的。

3、实战

现在微信已成为我们生活中必不可少的一种交通工具了,而订阅号也是微信的一个比较不错的功能。那我们就来模拟一下:有三个人订阅了这个公众号,但推送了一次消息后,有个人觉得不适合了,就取消订阅了

首先,是更新的 Observer 接口,用来提示消息更新:

public interface Observer {
    //推送消息
    void update(String msg);
}

接着是公众号这个类,包含订阅,取消订阅,和消息推送:

public class Subject {
    private String msg; //要发送的消息
    /**
     * 用来存储观察者的注册信息
     */
    private List<Observer> observers = new ArrayList<>();
    /**
     * 用来保存注册者的信息
     * @param observer
     */
    public void registerObserver(Observer observer){
        observers.add(observer);
    }
    public void unRegisterObserver(Observer observer){
        int index = observers.indexOf(observer);
        if (index >= 0){
            observers.remove(index);
        }
    }
    /**
     * 通知所有
     */
    protected void notifyObservers(){
        for (Observer observer : observers) {
            observer.update(msg);
        }
    }
    /**
     * 等消息改变的时候,通知所有注册的观察者
     * @param msg
     */
    public void setMsg(String msg){
        this.msg = msg;
        notifyObservers();
    }
}

然后就是订阅者了,如下:

public class Reader implements Observer {
    private static final String TAG = "zsr";
    private String name;
    public Reader(String name) {
        this.name = name;
    }
    @Override
    public void update(String msg) {
        Log.d(TAG, name+" 收到订阅的消息了:  "+msg);
    }
}

主函数我们就可以这样写了:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Subject subject = new Subject();
        Reader reader1 = new Reader("rachel");
        Reader reader2 = new Reader("Moon");
        Reader reader3 = new Reader("penel");
        //订阅
        subject.registerObserver(reader1);
        subject.registerObserver(reader2);
        subject.registerObserver(reader3);

        //推送消息
        subject.setMsg("今天是2017-9-17");
        subject.unRegisterObserver(reader2);
        subject.setMsg("取消绑定了一个");
    }
}

上面中,我们有三个人订阅了这个公众号,中途有一个人取消订阅了,打印如下:
这里写图片描述