介绍

在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知

访问者模式由两部分组成,观察者和被观察者。当被被观察者执行了被检测行为时,观察者就会发送通知。对于被观察者,可以将观察与业务分割开,观察的一些行为,例如增加观察者,删除观察者,通知观察者等行为是通用的,可以交由抽象类进行处理,具体的观察者实现类进行实现业务。同样观察者也可以抽象出一个接口,来约束处理观察的方法命名。

模板

类图

观察者模式 - 图1

代码

观察者

  1. package cn.zjm404.stu.dp.behavior.observer;
  2. /**
  3. * 观察者
  4. */
  5. public interface Observer {
  6. public void update();
  7. }
  1. package cn.zjm404.stu.dp.behavior.observer;
  2. public class ConcreteObserver implements Observer{
  3. @Override
  4. public void update() {
  5. System.out.println("被观察者进行了修改...开始更新依赖值...");
  6. }
  7. }

被观察者

  1. package cn.zjm404.stu.dp.behavior.observer;
  2. import java.util.Vector;
  3. /**
  4. * 观察者抽象类
  5. */
  6. public abstract class Subject {
  7. /**
  8. * 存储观察者
  9. */
  10. private Vector<Observer> observers = new Vector<>();
  11. public void addObserver(Observer _observer){
  12. observers.add(_observer);
  13. }
  14. public void delObserver(Observer _observer){
  15. observers.remove(_observer);
  16. }
  17. public void notifyObservers(){
  18. for (Observer observer : observers) {
  19. observer.update();
  20. }
  21. }
  22. }
  1. package cn.zjm404.stu.dp.behavior.observer;
  2. /**
  3. * 进行业务
  4. */
  5. public class ConcreteSubject extends Subject{
  6. public void doSomething(){
  7. super.notifyObservers();
  8. }
  9. }

测试

  1. package cn.zjm404.stu.dp.behavior.observer;
  2. public class Client {
  3. public static void main(String[] args) {
  4. ConcreteSubject cs = new ConcreteSubject();
  5. Observer obs = new ConcreteObserver();
  6. cs.addObserver(obs);
  7. cs.doSomething();
  8. }
  9. }

参考