行为型的设计模式 - 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 淘宝你的货已经到了