一、定义
观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
二、优点及缺点
优点:
1、观察者和被观察者之间是抽象耦合,容易扩展观察者。
2、可以建立一套触发机制。
缺点:
1、观察者较多时,容易造成阻塞,因此可以采用异步的方式通知。
三、代码实现:
抽象观察者:
package com.example.demo.sjms.guanchazhemoshi; /** * @Author: caesar * @Date:2020年11月24日 08:11:15 * @Description: 抽象观察者 */ public interface Watcher { public void update(); }
具体观察者:
package com.example.demo.sjms.guanchazhemoshi; /** * @Author: caesar * @Date:2020年11月24日 08:11:58 * @Description: 具体观察者 */ public class Student implements Watcher{ @Override public void update() { System.out.println("老师,下课啦,放学回家!!!"); } }
package com.example.demo.sjms.guanchazhemoshi; /** * @Author: caesar * @Date:2020年11月24日 08:11:06 * @Description: 具体观察者 */ public class Teacher implements Watcher{ @Override public void update() { System.out.println("同学们,下课啦,放学回家吧!!!"); } }
抽象被观察者:
package com.example.demo.sjms.guanchazhemoshi; import java.util.List; /** * @Author: caesar * @Date:2020年11月24日 08:11:03 * @Description: 抽象被观察者 */ public interface Watched { /** * @Author: caesar * @Date:2020年11月24日 08:11:44 * @Description: 添加观察者 */ public void addWatcher(Watcher watcher); /** * @Author: caesar * @Date:2020年11月24日 08:11:20 * @Description: 删除观察者 */ public void removeWatcher(Watcher watcher); /** * @Author: caesar * @Date:2020年11月24日 08:11:29 * @Description: 通知观察者 */ public void updateWatcher(); }
具体被观察者:
package com.example.demo.sjms.guanchazhemoshi; import java.util.ArrayList; import java.util.List; /** * @Author: caesar * @Date:2020年11月24日 08:11:26 * @Description: 课程 */ public class Class implements Watched{ private List<Watcher> watcherList; public Class(){ watcherList = new ArrayList<Watcher>(); } /** * @Author: caesar * @Date:2020年11月24日 08:11:44 * @Description: 添加观察者 */ @Override public void addWatcher(Watcher watcher) { watcherList.add(watcher); } /** * @Author: caesar * @Date:2020年11月24日 08:11:20 * @Description: 删除观察者 */ @Override public void removeWatcher(Watcher watcher) { watcherList.add(watcher); } /** * @Author: caesar * @Date:2020年11月24日 08:11:29 * @Description: 通知观察者 */ @Override public void updateWatcher() { watcherList.forEach(x -> { x.update(); }); } }
测试类:
package com.example.demo.sjms.guanchazhemoshi; /** * @Author: caesar * @Date:2020年11月24日 08:11:20 * @Description: 测试类 */ public class Test { public static void main(String[] args) { Teacher teacher = new Teacher(); Student student = new Student(); Class clazz = new Class(); clazz.addWatcher(teacher); clazz.addWatcher(student); // 开始通知 clazz.updateWatcher(); } }
四、源码级别
五、总结
使用场景:对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。