观察者模式

行为型的设计模式 - Oberver(观察者模式)

  一般而言,在我们生活中常见的观察者模式如:报纸订阅,电子商城中的降价通知

  在web应用中,如电商最常见的有物流接口,如快递100收费版:主动推送物流更新状态给订阅的客户。

      观察者的模式旨在解耦,消息持有者和对消息有兴趣的订阅者;通常也支持自行拉取信息,但通常认为由主题推送给订阅者更为恰当。

  总结:出版者+订阅者=观察者

下见2个接口,

1、Subject(主题接口)

  method:

    register()       --用于注册订阅者

    remove()        --用于解除订阅者

    notifyMessage()     --用于通知订阅者消息

2、Observer(订阅者接口)

  method:

    update()        --让主题接口方法notifyMessage调用

  

以下是JDK版本的实现,主要就2个类(1个抽象类,一个接口)。

抽象类:Observable(可被观察的[主题])-- 在具体业务中,一般使用接口,而非抽象类

接口:Oberver  (观察者)

下详见Demo的类代码:

package top.gabin.oa.web.design;

import java.util.Observable;
import java.util.Observer;

/**
 * 京东订阅者
 * @author linjiabin on  16/4/29
 */
public class JingdongObserver implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.print("I'm 京东");
        System.out.println(arg);
    }
}
package top.gabin.oa.web.design;

import java.util.Observable;
import java.util.Observer;

/**
 * 淘宝订阅者
 * @author linjiabin on  16/4/29
 */
public class TaobaoObserver implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.print("I'm 淘宝");
        System.out.println(arg);
    }
}
package top.gabin.oa.web.design;

import java.util.Observable;
import java.util.Observer;

/**
 * 快递100,物流主题
 * @author linjiabin on  16/4/29
 */
public class Kuaidi100Subject extends Observable {
    @Override
    public synchronized void addObserver(Observer o) {
        super.addObserver(o);
    }

    @Override
    public synchronized void deleteObserver(Observer o) {
        super.deleteObserver(o);
    }

    @Override
    public void notifyObservers() {
        super.notifyObservers();
    }

    @Override
    public void notifyObservers(Object arg) {
        super.notifyObservers(arg);
    }

    @Override
    public synchronized void deleteObservers() {
        super.deleteObservers();
    }

    @Override
    protected synchronized void setChanged() {
        super.setChanged();
    }

    @Override
    protected synchronized void clearChanged() {
        super.clearChanged();
    }

    @Override
    public synchronized boolean hasChanged() {
        return super.hasChanged();
    }

    @Override
    public synchronized int countObservers() {
        return super.countObservers();
    }
}
package top.gabin.oa.web.design;

import org.junit.Test;

/**
 * 测试类
 * @author linjiabin on  16/4/29
 */
public class TestObserver {

    @Test
    public void testObserver() {
        Kuaidi100Subject subject = new Kuaidi100Subject();
        TaobaoObserver taobaoObserver = new TaobaoObserver();
        subject.addObserver(taobaoObserver);
        subject.addObserver(new JingdongObserver());
        subject.setChanged();
        subject.notifyObservers("你的货已经到了");
    }

}

测试后的结果:

I'm 京东你的货已经到了
I'm 淘宝你的货已经到了
原文地址:https://www.cnblogs.com/gabin/p/5447867.html