当前位置:   article > 正文

java观察者模式的三种实现方式

java观察者模式的三种实现方式

Java中可以使用观察者模式开发,有三种简单的方式可以实现。

  • 自定义接口实现
    观察者
public interface Observer {
    public void update(Object o);
}
  • 1
  • 2
  • 3

观察者的实现

public class ObserverImpl implements Observer{
    private Object str;
    @Override
    public void update(Object o) {
        this.str = o;
        System.out.println(this.str);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

观察者的注入和方法调用

    @Autowired
    private List<Observer> observers;
    @GetMapping("impl/{str}")
    public void impl(@PathVariable("str")  String str){
        for (Observer observer : observers){
            observer.update(str);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 基于spring的事件
    先定义spring事件
public class CustEvent extends ApplicationEvent  {

    public String msg;

    public CustEvent(Object source, String msg) {
        super(source);
        this.msg = msg;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

事件监听器

@Component
public class CustEventListener {

    @EventListener()
    public void eventListen(ApplicationEvent applicationEvent){
        if(applicationEvent instanceof CustEvent){
            CustEvent custEvent = (CustEvent)applicationEvent;
            System.out.println(custEvent.msg);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

发布事件

    @GetMapping("event/{str}")
    public void event(@PathVariable("str")  String str){
        context.publishEvent(new CustEvent(this,str));
    }
  • 1
  • 2
  • 3
  • 4
  • 基于Java原生接口
    实现java.util.Observer
public class JavaObserverA implements Observer {

    private int myState;
    @Override
    public void update(Observable o, Object arg) {
        myState = ((JavaConcreteSubject)o).getState();
        System.out.println(myState);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

继承Observable类,注意发布时要调用父类的setChanged()和notifyObservers()方法

public class JavaConcreteSubject extends Observable {

    private int state;

    public void set(int s){
        state = s;  //目标对象的状态发生了改变
        setChanged();  //表示目标对象已经做了更改
        notifyObservers(state);  //通知所有的观察者
    }

    public int getState() {
        return state;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注册观察者,然后发布事件

    private JavaConcreteSubject subject = new JavaConcreteSubject();
    public testController(){
        subject.addObserver(new JavaObserverA());
    }
    @GetMapping("util/{str}")
    public void util(@PathVariable("str")  String str){
        subject.set(1);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/677516
推荐阅读
相关标签
  

闽ICP备14008679号