• 观察者模式小记


    观察者模式,我们有很多其他的方式来称呼它。比如熟悉的发布/订阅模式,回调方式,Listen监听等。

    我们看到很多源码中有Observer,Listen,Hook,Callback,基本用到了观察者模式;

    话不多说,直接来点代码说明下

    首先定义被观察者(抽象的,公有的)

    public interface Subject {
    
        /**
         * 添加观察者
         *
         * @param observer
         */
        void add(Observer observer);
    
        /**
         * 删除观察者
         *
         * @param observer
         */
        void del(Observer observer);
    
        /**
         * 通知所有观察者
         */
        void notifyObservers(String content);
    
    }

    再定一个被观察者自身操作的接口

    public interface IUser {
    
        /**
         * 自身操作
         */
        void operation();
    }

    再定义一个公用的被观察者实现类(这里可有可无,也可放到下面具体的观察者中)

    public abstract class AbstractSubject implements Subject {
    
        private Vector<Observer> observers;
    
        public AbstractSubject() {
            observers = new Vector<>();
        }
    
        @Override
        public void add(Observer observer) {
            observers.add(observer);
        }
    
        @Override
        public void del(Observer observer) {
            observers.remove(observer);
        }
    
        @Override
        public void notifyObservers(String content) {
            Enumeration<Observer> obs = this.observers.elements();
            while (obs.hasMoreElements()) {
                obs.nextElement().update(content);
            }
        }
    
    }

    接下来就是定义具体的被观察者

    public class MySubject extends AbstractSubject implements IUser {
        @Override
        public void operation() {
            System.out.println("update myself observer");
            notifyObservers("just update");
        }
    }

    被观察者有了,接下来就是观察者了

    首先定义下观察者接口

    public interface Observer {
        void update(String content);
    }

    然后定义具体的观察者

    public class Observer1 implements Observer {
        @Override
        public void update(String content) {
            System.out.println("update observer1,show content:"+content);
        }
    }

    最后就是具体的实现了

    public class ObserverTest {
        public static void main(String[] args) {
            MySubject subject = new MySubject();
            subject.add(new Observer1());
            subject.add(new Observer2());
            subject.operation();
        }
    }

    我们添加观察者,然后被观察者一有行动,观察者就能收到信息,并作出反应。

    上述运行结果如下:

     以上就是简单的阐释下观察者模式,实际中我们用到的场景比这复杂很多。

    观察者模式在实际项目和生活中非常常见,我们举几个经常发生的例子来说明。
    ● 文件系统
    比如,在一个目录下新建立一个文件,这个动作会同时通知目录管理器增加该目录,并 通知磁盘管理器减少1KB的空间,也就说“文件”是一个被观察者,“目录管理器”和“磁盘管理 器”则是观察者。
    ● 猫鼠游戏
    夜里猫叫一声,家里的老鼠撒腿就跑,同时也吵醒了熟睡的主人,这个场景中,“猫”就
    是被观察者,老鼠和人则是观察者。
    ● ATM取钱
    比如你到ATM机器上取钱,多次输错密码,卡就会被ATM吞掉,吞卡动作发生的时
    候,会触发哪些事件呢?第一,摄像头连续快拍,第二,通知监控系统,吞卡发生;第三, 初始化ATM机屏幕,返回最初状态。一般前两个动作都是通过观察者模式来完成的,后一个
    动作是异常来完成。
    ● 广播收音机
    电台在广播,你可以打开一个收音机,或者两个收音机来收听,电台就是被观察者,收
    音机就是观察者。

  • 相关阅读:
    mybatis plus foreach 的用法
    mongodb聚合查询
    mongodb and 和 or 查询
    mongodb全文搜索
    时间参数的传递
    rabbitmq
    AOP各种的实现
    OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防
    OAuth2.0认证和授权机制讲解
    MySQL主从复制
  • 原文地址:https://www.cnblogs.com/xzshare/p/12580455.html
Copyright © 2020-2023  润新知