观察者模式

使用场景:

  • 关联行为场景,需要注意的是,关联行为是可拆分的,而不是组合关系
  • 事件多集触发场景
  • 跨系统的消息交换场景,如消息队列,事件总线的处理机制

栗子

public class Coder implements Observer{
    private String name;

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

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Hi,"+name+",订阅源更新了,"+arg);
    }
}

public class DevTechFrontier extends Observable {
    public void postMessage(String content){
        setChanged();
        notifyObservers(content);
    }
}

public class Main {

    public static void main(String[] args) {
       DevTechFrontier devTechFrontier=new DevTechFrontier();
       Coder WZC=new Coder("wzc");
       Coder XHH=new Coder("笑呵呵");
       Coder SBQ=new Coder("伤不起");
       devTechFrontier.addObserver(WZC);
       devTechFrontier.addObserver(XHH);
       devTechFrontier.addObserver(SBQ);
       devTechFrontier.postMessage("今天很给力哦");
        List list=null;
        System.out.println(Collections.emptyList().getClass().toString());
    }
}

输出

Hi,伤不起,订阅源更新了,今天很给力哦
Hi,笑呵呵,订阅源更新了,今天很给力哦
Hi,wzc,订阅源更新了,今天很给力哦

关于实现的猜想

  • 观察者内部应该维护了一个订阅者的链表,每次调用notifyObservers()时,其实就是遍历链表,发送消息
  • 参见android LiveData