设计模式之观察模式

    技术2022-07-14  74

    观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式(Observer)完美的将观察者和被观察的对象分离开。(百度百科)。

    我们使用JDK提供的API来实现一个观察者模式,学生向老师提问问题,然后通知老师有学生提问,这个案例里面,老师属于观察者,需要实现Observer接口。学生属于被观察者,需要继承Observable类。学生发生变化通知老师。

    public class Student extends Observable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void askQuestions(String question) { //提问问题,发生改变 setChanged(); //通知被观察者,有学生提问问题 notifyObservers(question); } } public class Teacher implements Observer { //当观察者发生改变时,该方法被调用 public void update(Observable o, Object arg) { //Observable参数为发生改变的对象 arg为改变的内容 Student student = (Student)o; System.out.println(student.getName() + "问了问题:" + arg); } } public static void main(String[] args) { Student student = new Student(); student.setName("pharos"); Teacher teacher = new Teacher(); //在观察者中添加被观察者 student.addObserver(teacher); //发生改变时通知被观察者 student.askQuestions("nihao"); }

    在很多其他的开源项目中都有观察者模式的实现,比如谷歌工具类库Guava内部的EventBus的实现,以及Spring中的Listener实现等。在Spring中的观察者模式叫做发布订阅更为合适,在Spring中被观察者为ApplicationEvent,我们需要创建自己的Event继承ApplicationEvent作为被观察者。ApplicationEvent则是继承java.util.EventObject。表明这是一个事件对象。需要被订阅的事件。

    public class MessageEvent extends ApplicationEvent { private static final long serialVersionUID = 1L; private String eventType; private String message; public String getEventType() { return eventType; } public void setEventType(String eventType) { this.eventType = eventType; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public MessageEvent(Object source) { super(source); } }

    观察者则是需要实现ApplicationListener接口,这里叫做监听器或者订阅者更为合适,ApplicationListener监听订阅ApplicationEvent的变化,代码如下所示:

    @Component public class MessageEventListener implements ApplicationListener<MessageEvent> { public void onApplicationEvent(MessageEvent event) { String eventType = event.getEventType(); String message = event.getMessage(); //发布事件的对象 Object object = event.getSource(); } }

    有了订阅者和订阅事件,饭后就需要发布者信息,我们一般使用ApplicationContext对象发布事件,代码如下所示;

    public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext("cn.org.microservice.spring.ioc.event"); MessageEvent event = new MessageEvent(applicationContext); event.setEventType("发布"); applicationContext.publishEvent(event); }

    上面我们就是用Spring完成了一个简单的观察者模式,如果结合Spring XXXAwrae则可以监听Spring的生命周期。现实场景中用到的观察者模式还是很多的。观察者和被观察者之间建立了一个抽象的耦合。并且支持广播的模式。

    Processed: 0.015, SQL: 10