设计模式——观察者模式

323 阅读2分钟

文章目录

我们身边的观察者模式

在我们日常生活中,随处有观察者模式的身影,例如我们自习的时候在班级里看电影,有一位同学在看老师来了没,而这位同学就是观察者,老师就是被观察者。从这个简单的例子我们可以看出,观察者模式中,要有观察者和被观察者。其中被观察者需要有一个具体的实现,例如老师来了(可以理解为是一个动作),同时观察者也有实现,例如看到老师来了,把电影关了。

观察者模式的角色

一般情况下,观察者模式要有四个角色,分别是Subject(主题,即被观察者)ConcreteSubject(具体主题),Observe(观察者)ConcreteObserve(具体观察者)
在这里插入图片描述

代码说明观察者模式

首先我们需要有一个观察者,他负责看老师来了没

public interface StudentObserve {
    void seeTeacher();
}

然后有一个观察者的实现,也就是,当老师来了,我需要做出相应的动作

public class StudentObserveImpl implements StudentObserve {
    @Override
    public void seeTeacher() {
        System.out.println("老师来了,全体隐蔽!!!");
    }
}

好了,我们还需要有一个Subject接口,也就是被观察者,被观察者至少需要三个功能,添加观察者,删除观察者,通知观察者

public interface TeacherObject {
    void addObserve(StudentObserve studentObserve);
    void removeObserve(StudentObserve studentObserve);
    void notifyObserve();
}

另外,我们需要一个被观察者的实现,也就是来看看同学们都在干什么,其中list数组是用来存储观察者的,也就是有多少个人订阅了这个主题。

public class TeacherObjectImpl implements TeacherObject {
    List<StudentObserve> list = new ArrayList();
    @Override
    public void addObserve(StudentObserve studentObserve) {
        list.add(studentObserve);
    }

    @Override
    public void removeObserve(StudentObserve studentObserve) {
        list.remove(studentObserve);
    }

    @Override
    public void notifyObserve() {
        list.forEach(studentObserve -> {
            studentObserve.seeTeacher();
        });
    }
    
    /**
     * 老师来班级了
     */
    public void comeClass() {
        // 此处省略具体业务
        notifyObserve();
    }
}

下面我们可以测试了

public class Main {
    public static void main(String[] args) {
        TeacherObjectImpl teacherObject = new TeacherObjectImpl();
        StudentObserve studentObserve = new StudentObserveImpl();

        // 学生观察老师
        teacherObject.addObserve(studentObserve);

        // 老师来班级
        teacherObject.comeClass();
    }
}

可以看出,当老师来班级的时候,把风的就发出通知

在这里插入图片描述
好了,至此简单的观察者模式就实现了。