Java设计模式之观察者模式

小编 2026-07-10 阅读:1527 评论:0
观察者模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。   Subject(被观察者) 被观察的对象。当需要被观察的状态发生变化时,需要通知队...

观察者模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。

 \"\"

  • Subject(被观察者) 被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
  • ConcreteSubject 被观察者的具体实现。包含一些基本的属性状态及其他操作。
  • Observer(观察者) 接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
  • ConcreteObserver 观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

 

下面我们来实现一个简单的观察者模式

 

观察者 

/*
* 定义观察者对象
* */
class MyListener{

/*
* 观察者对象有一个被观察者对象的引用(Observable)
* 通过这个引用来知晓是那个对象发生了改变
* */
    protected MyObservable observable;
/*
* 定义一个布尔类型的信号
* 这个信号用来告知迭代观察者对象的程序应该由哪些观察者做出响应。
* */
    protected boolean flag = false;

/*
* 定义一个观察者对象做出响应的方法。
* */
    public void changeObject(){
        System.out.println(observable+\"已经讲完了课!\");
   }
}

 

被观察者

/*
* 实现被观察者的对象MyObervable
* */
class MyObservable{
/*
* 定义一个静态的ArrayList(lists)
* 用于存储所有被添加的观察者引用。
* */
private static List<MyListener> lists = new ArrayList<>();

/*
* 定义一个非静态的ArrayList(listlistener)
* 这是因为一个对象可以添加多个观察者,
* 而当对象发生变化时需要通知此对象的观察者,
* 所以每个对象的观察者需要另外进行存储。
* */
    private List<MyListener> listlistener = new ArrayList<>();

/*
* 注册观察者对象方法
* */
    public void addMyListener(MyListener listener){
        listener.observable = this;
        listlistener.add(listener);
        lists.add(listener);
    }

/*
* 注销观察者对象方法
* */
    public void removeMyListener(MyListener listener){
        listener.observable = null;
        listlistener.remove(listener);
        lists.remove(listener);
    }

/*
* 改变观察者的flag信号为true
* */
    public void changeflag(){
        for (MyListener listener:listlistener
             ) {
            listener.flag = true;
        }
    }

/*
* 观察者迭代器
* 对信号flag为true的观察者允许其做出响应
* 并重置信号flag
* */
    public static void notifyObser(){
        for (MyListener listener:lists
             ) {
            if(listener.flag==true){
                listener.changeObject();
                listener.flag = false;
            }
        }
    }
}

 

观察者具体

/*
* 定义具体观察者对象
* */
class Student extends MyListener{}

 

被观察者具体

/*
 * 定义具体被观察者对象
 * */
class Teacher extends MyObservable{

    /*
     * 定义一个需要观察者对象观察的逻辑方法
     * 在该方法中改变观察者的信号标志
     * 并调用静态方法notifyObser()通知迭代器进行观察者迭代
     * */
    public void teachingComplete(){
        System.out.println(\"我已经讲完了\");
        changeflag();
        MyObservable.notifyObser();
    }
}

 

测试代码

Teacher t1 = new Teacher();
Student s1 = new Student();
Student s2 = new Student();
t1.addMyListener(s1);
t1.addMyListener(s2);
t1.teachingComplete();
System.out.println(\"-------------\");
t1.removeMyListener(s1);
t1.teachingComplete();

/*
* Output:
我已经讲完了
MyProject.CSDN.Teacher@57829d67已经讲完了课!
MyProject.CSDN.Teacher@57829d67已经讲完了课!
-------------
我已经讲完了
MyProject.CSDN.Teacher@57829d67已经讲完了课!
* */

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表