美文网首页
观察者模式

观察者模式

作者: 码了个寂寞 | 来源:发表于2021-05-17 16:53 被阅读0次

    定义

    当一个对象的状态发生改变时,所有依赖于他的订阅者都会受到通知,这种就叫做观察者模式

    本质

    触发联动

    优点

    如果在不使用观察者模式情况下,如果想实时获取对象的状态并及时做出相应操作,一般会想到去轮循获取这个对象,这种开销极大(主动查询,观察者模式是被动获取)

    通过以下案例就能很明确的了解什么是观察者模式了:

    首先定义一个目标对象(被观察者)

    public class Subject {
    
        private List<Observer> observers = new ArrayList<Observer>();
    
        /**
         * 注册观察者
         * 
         * @param observer
         */
        public void attach(Observer observer) {
            this.observers.add(observer);
        }
    
        /**
         * 取消注册
         * 
         * @param observer
         */
        public void detach(Observer observer) {
            this.observers.remove(observer);
        }
    
        /**
         * 通知所有注册的观察者
         */
        protected void notifyObservers() {
            for (Observer item : observers) {
                item.update(this);
            }
        }
    
    }
    

    然后定义一个观察者

    public interface Observer {
    
        /**
         * 更新,当目标对象的状态发生改变时,这个方法会被调用
         * 
         * @param subject
         *            目标对象,方便获取相应的目标对象的状态
         * 
         */
        void update(Subject subject);
    
    }
    

    然后定义一个具体的目标对象(具体的被观察者)

    public class ConcreateSubject extends Subject {
    
        /**
         * 目标对象的状态
         */
        private String subjectState;
    
        public String getSubjectState() {
            return subjectState;
        }
    
        public void setSubjectState(String subjectState) {
            this.subjectState = subjectState;
            // 目标对象的状态发生改变,通知各个观察者
            notifyObservers();
        }
    
    }
    

    再定义一个具体的观察者

    public class ConcreateObserver implements Observer {
    
        @Override
        public void update(Subject subject) {
            System.out.println("目标对象的状态发生改变:" + ((ConcreateSubject) subject).getSubjectState());
        }
    
    }
    

    最后写一个测试类

    public class Client {
    
        public static void main(String[] args) {
    
            // 目标
            ConcreateSubject subject = new ConcreateSubject();
    
            // 订阅者
            Observer observer1 = new ConcreateObserver();
            Observer observer2 = new ConcreateObserver();
    
            // 注册
            subject.attach(observer1);
            subject.attach(observer2);
    
            // 目标对象发生改变
            subject.setSubjectState("启动。。。");
    
            // 取消注册
            subject.detach(observer1);
    
            // 再次改变
            subject.setSubjectState("再次启动。。。");
    
        }
    
    }
    

    打印日志为

    目标对象的状态发生改变:启动。。。
    目标对象的状态发生改变:启动。。。
    目标对象的状态发生改变:再次启动。。。

    相关文章

      网友评论

          本文标题:观察者模式

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