在现实生活中,一个对象的改变会引起其他许多对象的改变,比如商品降价了,很多人都会开心,明天要下雨,很多人会烦躁等等。在java里就是一对多的依赖关系,当某个对象发生改变时,需要通知所有依赖于他的对象更新。这种模式有的时候也被叫做订阅-发布模式。
观察者模式有四种角色:抽象主题,具体主题,抽象观察者,具体观察者。
抽象主题包括一个对观察者增加,删除和通知所有观察者的抽象方法,本身有一个集合用来存放所有的观察者,具体主题实现了通知所有观察者的具体方法。抽象观察者包含了一个更新自己的抽象方法,当接到主题通知时调用,具体观察者实现了这个方法
抽象主题:
abstract class Type { protected ArrayList<Observer> observers=new ArrayList<>(); public void add(Observer observer){ observers.add(observer); } public void remove(Observer observer){ observers.remove(observer); } //通知所有观察者 public abstract void excute(); }
具体主题
public class ConcreteType extends Type { @Override public void excute() { System.out.println("目标发生改变"); for (Observer observer : observers) { observer.reponse(); } } }
抽象观察者
public interface Observer { void reponse(); }
具体观察者1
public class ConcreteObserver1 implements Observer { public void reponse(){ System.out.println("观察者1收到"); } }
具体观察者2
public class ConcreteObserver2 implements Observer { @Override public void reponse() { System.out.println("观察者2收到"); } }
测试类
public class Client { public static void main(String[] args) { ConcreteType concreteType = new ConcreteType(); concreteType.add(new ConcreteObserver1()); concreteType.add(new ConcreteObserver2()); concreteType.excute(); } }
总结:每个主题负责管理对应的的观察者,当主题自身发生改变时,可以通知对应的所有观察者让他们做出响应/更新。
应用场景:当一个对象发生改变会影响其他许多对象时可以使用观察者模式,其他与这个对象有关的对象放到一个List里,此对象发生改变时调用自身方法通知所有和自身有关的其他对象。