观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
编写被观察者类
package com.atwu.miao.obserable;
import com.atwu.miao.vo.CatVo;
import org.springframework.stereotype.Component;
import java.util.Observable;
@Component
public class CatObservable extends Observable {
public void change(CatVo vo){
this.setChanged();
this.notifyObservers(vo);
System.out.println("已经通知观察者");
}
}
编写观察者类
package com.atwu.miao.observer;
import com.atwu.miao.obserable.CatObservable;
import com.atwu.miao.vo.CatVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Observable;
import java.util.Observer;
@Component
public class CatObserver implements Observer {
@Autowired
private CatObservable catObservable;
@PostConstruct
private void addObserver(){
catObservable.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
if (!(arg instanceof CatVo)){
return;
}
System.out.println("观察者1运行");
CatVo catVo = (CatVo) arg;
System.out.println(catVo.getName()+":"+catVo.getAge());
}
}
我多复制了一个观察者,后面会看到两个观察者输出日志。
编写一个controller用于触发被观察者变化
package com.atwu.miao.controller;
import com.atwu.miao.obserable.CatObservable;
import com.atwu.miao.vo.CatVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/observer")
public class ObserverController {
@Autowired
private CatObservable catObservable;
@RequestMapping("/change")
@ResponseBody
public String change(){
CatVo catVo = new CatVo();
catVo.setName("wu");
catVo.setAge(19);
catObservable.change(catVo);
return "请求完成";
}
}
访问“/observer/change”,控制台输出如下
2020-09-23 14:51:04.926 INFO 394236 --- [nio-9091-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-09-23 14:51:04.926 INFO 394236 --- [nio-9091-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-09-23 14:51:04.931 INFO 394236 --- [nio-9091-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 5 ms
观察者2运行
wu:19
观察者1运行
wu:19
已经通知观察者
总结:
1、观察者需要实现Observer接口,重写update方法。
2、被观察者需要继承Observable类。
3、要想观察者能观察到被观察者的改变,需要被观察者调用addObserver(需要添加的观察者)方法添加观察者。