zoukankan      html  css  js  c++  java
  • 观察者模式

    行为型的设计模式 - 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 淘宝你的货已经到了
  • 相关阅读:
    Seleniem---Python3---获取对象属性
    Selenium---Python3---cookie处理
    Selenium---Python3---控制浏览器滚动条
    Seleniem---Python3---JS调用
    Selenium---Python3---上传文件
    review——C# (7)抽象成员和抽象类
    review——C# (6)虚方法和覆写方法
    review——C# (5)屏蔽基类的成员
    review——C# (4)访问器的访问修饰符
    review——C# (3)readonly修饰符
  • 原文地址:https://www.cnblogs.com/gabin/p/5447867.html
Copyright © 2011-2022 走看看