基本设计模式--观察者模式

131 阅读2分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战

前言

没啥,今天轻松一点,逛知乎的时候无意之中刷到了一个讲Spring 观察者模式实现的小视频,感觉有点意思的,就在这里说明一下,什么是观察者模式。

与其在说明什么是这个模式之前,我们不如聊聊我们想要实现怎么样的功能,我想要这样一个功能,A 可以同时为B,C 提供服务,但是如果B或者C不满足某个条件,那么我就不为它提供服务。举个例子就是那么微信公众号一样,我可以同时为多个用户提供服务,但是如果用户B没有关注,那么用户B就不能享受服务。或者像老师给学生上课一样,老师可以给多个学生一起上课,但是如果学生被老师“请”出去之后就不能一起上课了。这里有两种状态,对于一个学生而言,如果好好听讲那么就能继续上课,如果不好好听讲,就不能,这个状态。

我们把能实现这样一种功能的设计模式叫做,观察者模式。

项目结构

想要实现这个模式很简单。

image.png

实现

我们定义了两个接口,当然这个设计模式其实和代理模式有那么一点像,都是通过了其他方来控制另一方。

两个接口很简单。

package com.huterox.observe;

//import java.util.Observer;

public interface Observable {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObserver();
}
package com.huterox.observe;

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

不过这里值得一提的是,我们的java里面其实实现了一个Observer接口。

image.png

接下来是我们的学生类

package com.huterox.observe;

public class Students implements Observer{


    private String name;
    private String message;
    public Students(){

    }
    public Students(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        this.message = message;
        this.quite();
    }

    public void quite(){
        System.out.println("学生"+this.name+"收到:"+this.message+"--老师英明!");
    }
}

老师类

package com.huterox.observe;

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

public class Teacher implements Observable{

    private String message;
    private String name;
    private List<Object> studentpool = new ArrayList<>();


    @Override
    public void registerObserver(Observer o) {
        studentpool.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        studentpool.remove(o);
    }

    @Override
    public void notifyObserver() {
        for(int i = 0; i < studentpool.size(); i++) {
            Observer observer = (Observer) studentpool.get(i);
            observer.update(message);
        }
    }

    public void setMessage(String message){
        this.message = message;
        this.notifyObserver();
    }
}

最后是测试类

package com.huterox.observe;

public class Test {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        Students xiaoming = new Students("小明");
        Students xiaogang = new Students("小刚");
        teacher.registerObserver(xiaoming);
        teacher.registerObserver(xiaogang);
        teacher.setMessage("上课");

        System.out.println("小刚不交作业,滚出去!");
        teacher.removeObserver(xiaogang);
        teacher.setMessage("上课");
    }
}

效果

最后来看看效果演示

image.png