• 设计模式第15篇:观察者模式


    一.观察者模式介绍

      观察者设计模式是一种行为设计模式,该模式中观察者为observer,被观察的对象称为subject。当我们对一个对象(subject对象)的状态感兴趣并且当这个对象的状态改变时观察它的对象(observer)将被通知时,应该考虑观察者设计模式,它处理的是一种一对多的关系,典型应用如消息订阅。

    二.观察者模式代码用例

      1.被观察者接口Subject

    /**被观察者对象接口*/
    interface Subject{
        /**
         * 注册观察者(订阅者)
         * @param observer 观察者
         */
        void register(Observer observer);
    
        /**
         * 删除观察者(订阅者)
         * @param observer 观察者
         */
        void unRegister(Observer observer);
    
        /**
         * 通知所有观察者
         */
        void notifyObservers();
    
        /**
         * 通知观察者的具体行为
         * @return 通知观察者的具体消息对象
         */
        Object getUpdate();
    }

      2.被观察对象实例MessageServer

    /**
     * 消息服务器(一个被观察的对象实例)
     */
    class MessageServer implements Subject{
        /**
         * 用于存储所有观察者的集合
         */
        private List<Observer> observerList;
        /**
         * 通知观察者的具体信息
         */
        private String message;
        /**
         * 被观察者对象标识,false表示状态未改变
         */
        private boolean flag = false;
    
        public MessageServer(){
            this.observerList = new ArrayList<>(16);
        }
        @Override
        public synchronized void register(Observer observer) {
            if(!observerList.contains(observer))
                observerList.add(observer);
        }
    
        @Override
        public synchronized void unRegister(Observer observer) {
            if(observerList.contains(observer))
                observerList.remove(observer);
        }
    
        @Override
        public void notifyObservers() {
            if(!flag)
                return;
            for(Observer ob:observerList){
                ob.update();
            }
            this.flag=false;
        }
    
        @Override
        public Object getUpdate() {
            return this.message;
        }
        public void postMessage(String message){
            System.out.println("post messages to MessageServer: "+message);
            this.message=message;
            this.flag=true;
            notifyObservers();
        }
    }

      3.观察者接口

    /**
     * 观察者对象接口
     */
    interface Observer{
    
        /**
         * 观察者收到信息后作出的动作
         */
        void update();
    
        /**
         * 将观察者绑定到被观察者对象上
         * @param subject 被观察者对象
         */
        void setSubject(Subject subject);
    }

      4.观察者对象实例

    /**
     * 消息订阅者对象
     */
    class MessageSubscriber implements Observer{
        /**
         * 观察者名字
         */
        private String name;
        /**
         * 被订阅对象
         */
        private Subject subject;
        public MessageSubscriber(String name,Subject subject){
            this.name=name;
            setSubject(subject);
        }
    
        @Override
        public void update() {
            String message=(String)subject.getUpdate();
            if(message==null||message.equals("")){
                System.out.println(name +"no messages to receive");
            }else{
                System.out.println(name +" receive the new message:"+message);
            }
        }
    
        @Override
        public void setSubject(Subject subject) {
            this.subject=subject;
        }
    }

      5.测试

    public class ObserverTest {
        public static void main(String[] args){
            MessageServer messageServer=new MessageServer();
            MessageSubscriber subscriber1=new MessageSubscriber("张三",messageServer);
            MessageSubscriber subscriber2=new MessageSubscriber("李四",messageServer);
            MessageSubscriber subscriber3=new MessageSubscriber("王五",messageServer);
            messageServer.register(subscriber1);
            messageServer.register(subscriber2);
            messageServer.register(subscriber3);
            int i=0;
            while(i<10){
                messageServer.postMessage("新的消息1");
                messageServer.unRegister(subscriber2);
                messageServer.postMessage("新的消息2");
                i++;
            }
    
        }
    }

    三.观察者模式应用场景

      观察者模式也被称为发布-订阅模式,主要应用在消息订阅等服务中。

      jdk中用到的观察者模式:java.util.EventListener in Swing;

                  javax.servlet.http.HttpSessionBindingListener;

                  javax.servlet.http.HttpSessionAttributeListener

      

  • 相关阅读:
    【Docker】-NO.131.Docker.1 -【Docker】
    【HBase】-NO.140.HBase.1 -【HBase】
    【Vagrant】-NO.130.Vagrant.1 -【Vagrant】
    【技巧】-NO.123.数据处理技巧
    【Common】-NO.122.common.1
    【心得】-NO.114.面试.1 -【To HR And Interviewer】
    【JVM】-NO.113.JVM.1 -【JDK11 HashMap详解-4-resize()】
    【JVM】-NO.114.JVM.1 -【JDK11 HashMap详解-3-put-treeifyBin()-AVL】
    【JVM】-NO.115.JVM.1 -【JDK11 HashMap详解-4-伸展树、B树】
    【JVM】-NO.116.JVM.1 -【JDK11 HashMap详解-5-红黑树】
  • 原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10281078.html
Copyright © 2020-2023  润新知