「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」
前言
没啥,今天轻松一点,逛知乎的时候无意之中刷到了一个讲Spring 观察者模式实现的小视频,感觉有点意思的,就在这里说明一下,什么是观察者模式。
与其在说明什么是这个模式之前,我们不如聊聊我们想要实现怎么样的功能,我想要这样一个功能,A 可以同时为B,C 提供服务,但是如果B或者C不满足某个条件,那么我就不为它提供服务。举个例子就是那么微信公众号一样,我可以同时为多个用户提供服务,但是如果用户B没有关注,那么用户B就不能享受服务。或者像老师给学生上课一样,老师可以给多个学生一起上课,但是如果学生被老师“请”出去之后就不能一起上课了。这里有两种状态,对于一个学生而言,如果好好听讲那么就能继续上课,如果不好好听讲,就不能,这个状态。
我们把能实现这样一种功能的设计模式叫做,观察者模式。
项目结构
想要实现这个模式很简单。
实现
我们定义了两个接口,当然这个设计模式其实和代理模式有那么一点像,都是通过了其他方来控制另一方。
两个接口很简单。
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接口。
接下来是我们的学生类
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("上课");
}
}
效果
最后来看看效果演示