观察者模式

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

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

  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

  未完待续。。。