美文网首页
Java 观察者模式

Java 观察者模式

作者: 索性流年 | 来源:发表于2021-02-08 08:54 被阅读0次

    文集地址

    一句话总结观察者模式

    • 找人看着一件事,有情况就通知你

    什么是观察者模式?

    • 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

    应用场景小案例

    • 一家车店丢了一台车,却不知道被谁偷了,这台车的损失只能由店主自己承担,为了避免这样的损失,他只能在店里安装监控警报,这样,谁在来偷车,警报便会报警,告诉店主有人来偷车,他就可以拎着棍子下来抓小偷。

    • 总结: 设立一个观察角色(监控),时时刻刻盯着一个对象(车),当这个对象发生改变时便会告知设立方(店主),设立方便会做出相应的处理。

    实现案例

    • 被观察者
    /**
     * 被观察者(车)
     *
     * @author ext.liuyan10
     * @date 2021/2/5 15:53
     */
    public class Car extends Observable {
        /**
         * 车位状态(0在位 1被盗)
         */
        private Integer type;
    
        /**
         * 车位状态改变
         * @param type 车位状态
         */
        public void setType(Integer type) {
            this.type = type;
            System.out.println("车位状态改变");
            //通知观察者
            setChanged();
            //发送车位消息
            notifyObservers(type);
        }
    }
    
    
    
    • 观察者
    /**
     * 观察者(店主)
     *
     * @author ext.liuyan10
     * @date 2021/2/5 16:01
     */
    public class CarConcreteObserver implements Observer {
    
        public CarConcreteObserver() {
        }
    
        /**
         * 接收报警信息
         */
        @Override
        public void update(Observable o, Object arg) {
            if(arg instanceof Integer){
                if (0 == (Integer) arg){
                    System.out.println("车还在");
                }
                else {
                    System.out.println("车不在了拿棍子");
                }
            }
        }
    
    • 调用案例
    /**
     * @author ext.liuyan10
     * @date 2021/2/5 16:09
     */
    public class ObserverApp {
        public static void main(String[] args) {
            //创建被观察对象
            Car car = new Car();
            car.setType(1);
            System.out.println("没装监控不知道");
            //创建观察者
            CarConcreteObserver carConcreteObserver = new CarConcreteObserver();
            car.addObserver(carConcreteObserver);
    
            car.setType(0);
            car.setType(1);
        }
    }
    
    

    *打印结果

    Connected to the target VM, address: '127.0.0.1:53160', transport: 'socket'
    车位状态改变
    没装监控不知道
    车位状态改变
    车还在
    车位状态改变
    车不在了拿棍子
    Disconnected from the target VM, address: '127.0.0.1:53160', transport: 'socket'
    
    Process finished with exit code 0
    

    相关文章

      网友评论

          本文标题:Java 观察者模式

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