美文网首页
观察者模式

观察者模式

作者: OPice | 来源:发表于2019-12-19 21:22 被阅读0次

    介绍

    观察者属于行为模式,当一个对象改变时,会通知订阅者做相应的处理。
    是一种低耦合的方式,观察者和被观察者者之间不互相依赖。
    缺点或者说需要注意的点:1、如果观察者很多,要通知所有的观察者需要很多时间 2、观察者之间互相循环调用,会导致系统崩溃。

    Demo

    1、定义一个被观察者

    public class Subject {
        //监控的状态
        private Integer state;
    
        //维护所有观察者的列表
        private List<Observer> observerList = new ArrayList<>();
    
        public Integer getState() {
            return state;
        }
    
        //状态被改变 通知所有的观察者
        public void setState(Integer state) {
            this.state = state;
            notifyAllObserver();
        }
    
        public void attach(Observer observer) {
            observerList.add(observer);
        }
    
        //通知
        public void notifyAllObserver() {
            observerList.forEach(Observer::update);
        }
    }
    

    2、定义多个观察者

    /**
     * 二进制观察者
     */
    public class BinaryObserver extends Observer {
    
        public BinaryObserver(Subject subject) {
            this.subject = subject;
            subject.attach(this);
        }
    
        @Override
        void update() {
            System.out.println("BinaryObserver :"+Integer.toBinaryString(subject.getState()));
        }
    }
    
    /**
     * 八进制观察者
     */
    public class OctalObserver extends Observer {
        public OctalObserver(Subject subject) {
            this.subject = subject;
            subject.attach(this);
        }
    
        @Override
        void update() {
            System.out.println("OctalObserver :" + Integer.toOctalString(subject.getState()));
        }
    }
    
    /**
     * 十六进制观察者
     */
    public class HexObserver extends Observer {
        public HexObserver(Subject subject) {
            this.subject = subject;
            subject.attach(this);
        }
    
        @Override
        void update() {
            System.out.println("HexObserver :" + Integer.toHexString(subject.getState()));
        }
    }
    

    3、执行

    public class ObserverPatternTest {
        public static void main(String[] args) {
            Subject subject = new Subject();
    
            new BinaryObserver(subject);
            new HexObserver(subject);
            new OctalObserver(subject);
    
            subject.setState(10);
            subject.setState(15);
        }
    }
    

    4、执行结果


    image.png

    相关文章

      网友评论

          本文标题:观察者模式

          本文链接:https://www.haomeiwen.com/subject/prevnctx.html