设计模式——观察者模式

我们身边的观察者模式

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

观察者模式的角色

一般情况下,观察者模式要有四个角色,分别是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();
    }
}

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

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

相关推荐
<p> 课程演示环境:Windows10  </p> <p> 需要学习<span>Ubuntus</span>系统<span>YOLOv4-tiny</span>的同学请前往《<span>YOLOv4-tiny</span>目标检测实战:训练自己的数据集》 <span></span> </p> <p> <span> </span> </p> <p> <span style="color:#E53333;">YOLOv4-tiny</span><span style="color:#E53333;">来了!速度大幅提升!</span><span></span> </p> <p> <span> </span> </p> <p> <span>YOLOv4-tiny</span>在<span>COCO</span>上的性能可达到:<span>40.2% AP50, 371 FPS (GTX 1080 Ti)</span>。相较于<span>YOLOv3-tiny</span>,<span>AP</span>和<span>FPS</span>的性能有巨大提升。并且,<span>YOLOv4-tiny</span>的权重文件只有<span>23MB</span>,适合在移动端、嵌入式设备、边缘计算设备上部署。<span></span> </p> <p> <span> </span> </p> <p> 本课程将手把手地教大家使用<span>labelImg</span>标注和使用<span>YOLOv4-tiny</span>训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。<span></span> </p> <p> <span> </span> </p> <p> 本课程的<span>YOLOv4-tiny</span>使用<span>AlexAB/darknet</span>,在<span>Windows10</span>系统上做项目演示。包括:<span>YOLOv4-tiny</span>的网络结构、安装<span>YOLOv4-tiny</span>、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计<span>(mAP</span>计算<span>)</span>和先验框聚类分析。 <span> </span> </p> <p> <span> </span> </p> <p> 除本课程《<span>Windows</span>版<span>YOLOv4-tiny</span>目标检测实战:训练自己的数据集》外,本人推出了有关<span>YOLOv4</span>目标检测的系列课程。请持续关注该系列的其它视频课程,包括:<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:训练自己的数据集》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:人脸口罩佩戴识别》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:中国交通标志识别》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测:原理与源码解析》<span></span> </p> <p> <span> <img alt="" src="https://img-bss.csdnimg.cn/202007061503586145.jpg" /></span> </p> <p> <span><img alt="" src="https://img-bss.csdnimg.cn/202007061504169339.jpg" /><br /> </span> </p>
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页