设计模式

设计模式--观察者(订阅)模式

2019-03-25  本文已影响0人  二妹是只猫

模式介绍

定义与类型

使用场景

UML类图

Observer-Pattern

coding
Observer和Observable都是jdk的内置对象,这里精简了部分更方便阅读

public interface Observer {
    void update(Observable o, Object arg);
}
*  ConcreteObserver
public class Observable {
    private final ArrayList<Observer> observers;

    public Observable() {
        observers = new ArrayList<>();
    }
    public synchronized void addObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
        if (!observers.contains(o)) {
            observers.add(o);
        }
    }
   public void notifyObservers(Object arg) {
        Observer[] arrLocal;
        synchronized (this) {
            if (!hasChanged())
                return;

            arrLocal = observers.toArray(new Observer[observers.size()]);
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            arrLocal[i].update(this, arg);
    }
public class User implements Observer {
    private String name;

    public User(String name){
        this.name = name;
    }
    @Override
    public void update(Observable o, Object arg) {
        System.out.println(name+"收到了通知:"+arg);
    }
}
public class Weixindigg extends Observable {

    private void postMessage(String msg){
        setChanged();
        notifyObservers(msg);
    }
}

    public static void main(String[] args) {
        User xiaohong = new User("小红");
        User xiaobai = new User("小白");
        User xiaolan = new User("小蓝");
        Weixindigg weixindigg = new Weixindigg();
        weixindigg.addObserver(xiaobai);
        weixindigg.addObserver(xiaohong);
        weixindigg.addObserver(xiaolan);
        weixindigg.notifyObservers("77连射后撤步三分");
    }

小蓝收到了通知:77连射后撤步三分
小红收到了通知:77连射后撤步三分
小白收到了通知:77连射后撤步三分

Process finished with exit code 0

可以看到订阅了工作号的用户都收到了更新消息,一对多的订阅。
Observer和Observerble都是JDK中的内置类型,可见观察者模式的重要性。

上一篇 下一篇

猜你喜欢

热点阅读