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

    观察者模式

    观察者模式,主题发布新的内容,订阅者可以获取到最新的消息。也就是当被观察者(观察对象)改变的时候,会通知观察者更新状态。

    • Subject:主题
    • Observer:观察者的抽象类
    • HexObserver: 看到的主题发布的数据是16进制的。
    • BinaryObserver:看到的数据是二进制。

    在这里插入图片描述

    代码:

    Subject

    public class Subject {
        private int state;
        private List<Observer> observers = new ArrayList<>();
    
        /**
         *
         *获取最新的主题状态
         */
        public int getState() {
            return state;
        }
    
        public void setState(int state) {
            this.state = state;
            //每次更改主体的状态需要通知所有观察者
            notifyAllObservers();
        }
    
        /**
         * 注册观察者
         * @param observer
         */
        public void attach(Observer observer){
            observers.add(observer);
        }
    
        /**
         * 通知每个订阅主题的观察者,更新状态
         */
        public void notifyAllObservers(){
            for (Observer observer : observers) {
                observer.update();
            }
        }
    }
    

    Observer

    public abstract class Observer {
        protected Subject subject;
        public abstract void update();
    }```
    ### BinaryObserver
    ```java
    public class BinaryObserver extends Observer {
    
        public BinaryObserver(Subject subject) {
            this.subject = subject;
            // 订阅主题
            this.subject.attach(this);
        }
    
        @Override
        public void update() {
            String result = Integer.toBinaryString(this.subject.getState());
            System.out.println("二进制的数据被更新为: "+result);
        }
    }
    

    HexObserver

    public class HexObserver extends Observer {
    
        public HexObserver(Subject subject) {
            this.subject = subject;
            // add observer to Subject
            this.subject.attach(this);
        }
    
        @Override
        public void update() {
            String result = Integer.toHexString(this.subject.getState());
            System.out.println("十六进制数据被更新为:"+result);
        }
    }
    

    调用

    public class ObserverPatternTest {
        public static void main(String[] args) {
            Subject subject = new Subject();
            HexObserver hexObserver = new HexObserver(subject);
            BinaryObserver binaryObserver = new BinaryObserver(subject);
            subject.setState(16);
            //十六进制数据被更新为:10
    		//二进制的数据被更新为: 10000
        }
    }
    

    调用过程
    在这里插入图片描述

  • 相关阅读:
    jchdl
    jchdl
    UVa 10256 (判断两个凸包相离) The Great Divide
    UVa 11168 (凸包+点到直线距离) Airport
    LA 2572 (求可见圆盘的数量) Kanazawa
    UVa 10652 (简单凸包) Board Wrapping
    UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
    UVa 10674 (求两圆公切线) Tangents
    UVa 11796 Dog Distance
    LA 3263 (平面图的欧拉定理) That Nice Euler Circuit
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121857.html
Copyright © 2011-2022 走看看