PerKins Zhu

Le vent se lève,il faut tenter de vivre.
随笔 - 87, 文章 - 0, 评论 - 45, 阅读 - 21万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

设计模式—观察者模式

Posted on   PerKins.Zhu  阅读(177)  评论(0编辑  收藏  举报

观察者模式:如果一个对象(被观察者)状态改变时需要去通知其他对象(观察者)进行一些操作,此时可以使用观察者模式。

      其实质还是通过观察者调用本身的方法进行操作。

示例说明:班长告诉学生老师来了。被观察者:班长,观察者:学生

被观察者:

复制代码
package com.zpj.designMode.observerPattern;

import java.util.ArrayList;
import java.util.List;

public class Monitor {
    private List<Observer> obers = new ArrayList<Observer>();

    public void notifyStudent() {
        for (Observer ob : obers) {
            ob.teacherIsComming();
        }
    }

    public void addObserver(Observer ob) {
        if (ob != null)
            obers.add(ob);
    }

    public void removeObserver(Observer ob) {
        if (ob != null)
            obers.remove(ob);
    }

}
复制代码

 

定义观察者接口:

package com.zpj.designMode.observerPattern;

public interface Observer {

    public void teacherIsComming();
}

 

观察者实现类:

复制代码
package com.zpj.designMode.observerPattern;

public class Student01 implements Observer {

    @Override
    public void teacherIsComming() {
        System.out.println("--------student01  reading");
    }

}


package com.zpj.designMode.observerPattern;

public class Student02 implements Observer {

    @Override
    public void teacherIsComming() {
        System.out.println("--------student01  reading");
    }

}


package com.zpj.designMode.observerPattern;

public class Student03 implements Observer {

    @Override
    public void teacherIsComming() {
        System.out.println("--------student01  reading");
    }

}
复制代码

 

测试类:

复制代码
package com.zpj.designMode.observerPattern;

import org.junit.Test;

public class TestUtil {

    @Test
    public void test01() {
        Monitor mo = new Monitor();
        Observer s1 = new Student01();
        Observer s2 = new Student02();
        Observer s3 = new Student03();

        mo.addObserver(s3);
        mo.addObserver(s2);
        mo.addObserver(s1);

        mo.notifyStudent();
    }

    // java 的观察者模式
    @Test
    public void test02() {
        Monitor02 mo02 = new Monitor02();
        java.util.Observer student04 = new Student04();
        mo02.addObserver(student04);
        mo02.teacherIsComming();

    }
}
复制代码

 

java中是定义的有观察者接口和被观察者抽象类的

复制代码
package com.zpj.designMode.observerPattern;

import java.util.Observable;

public class Student04 implements java.util.Observer {

    // 实现update抽象方法,在被观察者发生变化之后又在该方法中进行操作
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("------------student04- -----------" + arg);
    }

}
复制代码

 

 

复制代码
package com.zpj.designMode.observerPattern;

public class Monitor02 extends java.util.Observable {

    public void teacherIsComming() {
        // 设置changed = true,因为当changed== ture的时候才会调用观察者的update()方法。
        setChanged();
        // 通知观察者被观察者发生改变
        notifyObservers("teacher is comming !!!!");
        ;
    }

}
复制代码

 

测试方法见test02()。

参考链接:观察者模式

------------------------

 

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
点击右上角即可分享
微信分享提示