〇、小故事
小明学生在学校上完课回家,写完作业后,想要通过微信的方式,把作业提交给老师,但是呢,老师的微信没在线,估计是忙别的去了。
那么,小明就每隔一段时间,看看微信上老师在不在。当天是情人节,老师和男朋友去看电影吃宵夜,凌晨2点才到家。小明怕作业交不上去,一直等到凌晨2点,才终于等到老师上线,把作业交上去了。这可给小明累坏了。
针对这个问题,老师说了,以后大家不用这样了,你们做完作业就忙自己的事儿吧。如果我打算批作业的话,我会在群里通知大家的,然后你们在把作业给我就可以了。如果我忘记通知大家,这个也不算你们的错误,算老师的哈。同学们从此解脱了。
根据上面的例子我们可以看到,上交作业的行为由老师进行发起,然后在群众的班级同学们就都会收到老师的通知了。如果班级来了新同学或者有哪些同学转校了,只需要添加新同学到班级群中 或者 将转校同学移除班级群即可,那么这个模式就是我们今天要介绍的设计模式——观察者模式。
一、模式定义
观察者模式(Observer Pattern
)
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
这里我们也可以采用拉的方式,因为推的方式,可能会推过来一堆我不需要的信息。那么,当有通知过来,我收到了,我自己再去拉我自己需要的内容。而不是采用你给我什么,我就接收什么。
任何时候,我们都可以增加新的观察者。因为主题唯一依赖的东西是一个实现Observer接口的对象列表,所以我们可以随时增加观察者。观察者模式的故事如下所示:
二、模式类图
针对上面的故事,我们来画一下该模式的类图。首先,创建主题接口类Subject,该类是用于管理和通知观察者的,其实现类是ConcreteSubject。然后,我们在创建观察者接口Observer,以及观察者实现类ConcreteObserver。具体类图如下所示:
三、代码实现
创建观察者接口类:Observer.java
public interface Observer { void update(); }
创建观察者实现类1:ConcreteObserver1.java
public class ConcreteObserver1 implements Observer { public void update() { System.out.println("ConcreteObserver1"); } }
创建观察者实现类2:ConcreteObserver2.java
public class ConcreteObserver2 implements Observer { public void update() { System.out.println("ConcreteObserver2"); } }
创建观察者实现类3:ConcreteObserver3.java
public class ConcreteObserver3 implements Observer { public void update() { System.out.println("ConcreteObserver3"); } }
创建主题类:Subject.java
public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObserver(); }
创建主题实现类:ConcreteSubject.java
public class ConcreteSubject implements Subject { private List<Observer> observers; public ConcreteSubject() { this.observers = new ArrayList<>(); } public void registerObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } public void notifyObserver() { observers.forEach(observer -> observer.update()); } }
创建测试类:OberverTest.java
public class OberverTest { public static void main(String[] args) { Observer cObserver1 = new ConcreteObserver1(); Observer cObserver2 = new ConcreteObserver2(); Observer cObserver3 = new ConcreteObserver3(); /** 创建主题 */ ConcreteSubject subject = new ConcreteSubject(); /** 注册三个监听者*/ subject.registerObserver(cObserver1); subject.registerObserver(cObserver2); subject.registerObserver(cObserver3); /** 发送通知 */ System.out.println("----------给cObserver1、cObserver2、cObserver3发通知----------"); subject.notifyObserver(); /** 移除一个监听者ConcreteObserver2*/ subject.removeObserver(cObserver2); System.out.println("----------给cObserver1、cObserver3发通知----------"); subject.notifyObserver(); } }
执行后的结果:
----------给cObserver1、cObserver2、cObserver3发通知---------- ConcreteObserver1 ConcreteObserver2 ConcreteObserver3 ----------给cObserver1、cObserver3发通知---------- ConcreteObserver1 ConcreteObserver3
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」