观察者模式

Posted 海小鑫

tags:

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

 

  观察者模式也是 发布-订阅模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象在状态发生变化的时候,会通知所有观察者对象,使他们能够自动更新自己。

  观察者模式主要包括以下几个角色:

  1、Subject(抽象主题角色)

  2、ConcreteSubject(具体的主题角色):它会存有所有观察者的引用,以便于及时通知他们。

  3、Observer(抽象观察者角色)

  4、ConcreteObserver(具体的观察者)

 

  下面就直接上代码:

  1、先定义抽象主题角色:包括注册观察者和移除观察者,以及通知观察者

package com.hd.observer;

public interface Observable {

    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyAllObservers();
}

 

  2、具体观察者

package com.hd.observer;

import java.util.ArrayList;
import java.util.List;

public class WechatServer implements Observable {

    private List<Observer> observers = new ArrayList<Observer>();
    private String msg;
    
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    
    @Override
    public void notifyAllObservers() {
        
        for(Observer observer: observers){
            observer.update(msg);
        }
    }
    
    public void setInformation(String msg){
        System.out.println("wechat push message: "+ msg);
        this.msg = msg;
        notifyAllObservers();  //状态改变的时候,同时触发通知观察者
    }
}

 

  3、抽象观察者。 它会有一个update方法,用来接收主题角色的通知

package com.hd.observer;

public interface Observer {
    void update(String msg);    //接收主题角色的通知
}

 

  4、具体的观察者

package com.hd.observer;

public class ConcreteObserver implements Observer {

    private String name;
    public ConcreteObserver(String name) {
        this.name = name;
    }
    
    @Override
    public void update(String msg) {
        System.out.println(name + " receive message: " + msg);
        
    }
}

 

  5、下面测试一下:

package com.hd.observer;

public class TestObserver {

    public static void main(String[] args) {
        
        ConcreteObserver o1 = new ConcreteObserver("jack");
        ConcreteObserver o2 = new ConcreteObserver("jet");
        ConcreteObserver o3 = new ConcreteObserver("tony");
        
        WechatServer server = new WechatServer();
        server.registerObserver(o1);
        server.registerObserver(o2);
        server.registerObserver(o3);
        server.setInformation("java is the world best language");
System.
out.println("------------------------------");
server.removeObserver(o1); server.setInformation(
"python is the world best language"); } }

  

  看下测试结果:

wechat push message: java is the world best language
jack receive message: java is the world best language
jet receive message: java is the world best language
tony receive message: java is the world best language
------------------------------
wechat push message: python is the world best language
jet receive message: python is the world best language
tony receive message: python is the world best language

 

  未完待续。。。

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

未调用 LiveData 观察者

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

如何为片段设置观察者

永远观察实时数据的片段

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

观察者模式