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

    观察者模式

    观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

    优点

    • 省去了反复检索状态的资源消耗(轮询)
    • 得到更快的反应速度

    缺点

    1. 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
    2. 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
    3. 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

    适用场景

    季度分享差不多落幕,大家满心期待大波的审批结果,没人心里无时无刻不想去大波那里问一下结果如何,但是这样大波心里叫苦,每时每刻都有人来骚扰,不胜其烦,所以,观察者模式出场

    类图如下

    观察者模式

    实例代码

    package com.jack.idea.test.designmode;
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 观察者模式
     *
     * @author ljs.song
     * @date 2018-01-02 10:40
     */
    public class ObserverClient {
    
        public static void main(String[] args) {
            //大boss大波出场
            DaboSubject daboSubject = new DaboSubject();
            //小杰向大boss表明想第一时间知道结果
            XiaoJieObserver xiaoJieObserver = new XiaoJieObserver();
            daboSubject.registerObserver(xiaoJieObserver);
    
            //小臣也想知道结果
            XiaoChenObserver xiaoChenObserver = new XiaoChenObserver();
            daboSubject.registerObserver(xiaoChenObserver);
    
            //小龙表示我也想知道
            XiaoLongObserver xiaoLongObserver = new XiaoLongObserver();
            daboSubject.registerObserver(xiaoLongObserver);
    
            //大波进行一次初步评审变动
            daboSubject.notifyAllObserver("大家好我初步做了评审,请查看是否有疑问");
            System.out.println("--------------------------");
            //小龙觉得有疑问,告诉了大波,大波重新修改了小龙的评审结果
            daboSubject.notifyObserver(2,"我给你改了,再看下有没有问题");
        }
    }
    
    /**
     * 被观察者,主题
     */
    abstract class Subject{
    
        protected List<Observer> observers = new ArrayList<>();
    
        void registerObserver(Observer observer){
            if(observer != null && !observers.contains(observer)){
                observers.add(observer);
            }
        }
    
        void removeObserver(Observer observer){
            if(observer != null && observers.contains(observer)){
                observers.remove(observer);
            }
        }
    
        /**
         * 通知全部观察者
         */
        abstract void notifyAllObserver(String messages);
    
        /**
         * 通知指定观察者
         * @param i
         * @param message
         */
        abstract void notifyObserver(int i,String message);
    }
    
    /**
     * 观察者
     */
    interface Observer{
    
        void update(String message);
    }
    
    /**
     * 大波,真正的被观察者
     */
    class DaboSubject extends Subject {
    
    
        /**
         * 状态变化后通知各个观察者
         */
        @Override
        public void notifyAllObserver(String message) {
            for (Observer observer1 : this.observers) {
                observer1.update(message);
            }
        }
    
        @Override
        void notifyObserver(int i,String message) {
            observers.get(i).update(message);
        }
    }
    
    /**
     * 小杰接受被观察者的信息
     */
    class XiaoJieObserver implements Observer{
    
        @Override
        public void update(String message) {
            System.out.println("小杰收到通知:" + message);
        }
    }
    
    /**
     * 小臣等待被观察者的信息
     */
    class XiaoChenObserver implements Observer{
    
        @Override
        public void update(String message) {
            System.out.println("小辰收到通知:" + message);
        }
    }
    
    /**
     * 小龙等待信息公布
     */
    class XiaoLongObserver implements Observer{
    
        @Override
        public void update(String message) {
            System.out.println("小龙收到通知:" + message);
        }
    }
    

    转载请注明出处 阿布的夏天

  • 相关阅读:
    把握人生12种财富:让商人更自信
    英语谚语的汉译
    心胸有多大,事业才可能有多大
    想成领袖?先瞄准老板身边的位置
    绝对挑战:如何来提高自己的影响力?
    送给创业的朋友:落入坑洞的猎人
    跨越危机,塑造完美的职业生涯(三)
    如果一个男人真的爱你
    跨越危机,塑造完美的职业生涯(一)
    来自最伟大推销员的成功金句
  • 原文地址:https://www.cnblogs.com/jackslj/p/11531797.html
Copyright © 2011-2022 走看看