观察者模式思考

介绍

观察者模式是一种行为型模式,采用一对多的方式,一是主题,多是指多个观察者,多个观察者监听了主题,如果主题发生变化,那么多个观察者就会收到通知,然后多个观察者再发生变化。

通俗解释:就是将观察者类都维护到主题的容器中去,主题发生变化就遍历容器通知观察者。

抽象主题(ISubject)
具体主题(ConcreteSubject)
抽象观察者(IObserver)
具体观察者(ConcreteObserver)

实例代码

  1. 抽象主题
public abstract class MyAbstractTitle {
    
    private List list = new ArrayList();
    
    public void addObserver(MyObserver observer) {
        list.add(observer);
    }
    
    public void delObserver(MyObserver observer) {
        list.remove(observer);
    }
    
    public void notifyObserver() {
        Iterator its = list.iterator();
        
        while (its.hasNext()) {
            its.next().receiveInfo();
        }
    }
}
  1. 具体主题
public class MyConcreteTitle extends MyAbstractTitle{
    
    public void executeNotify() {
        notifyObserver();
    }
}
  1. 抽象观察者
public interface MyObserver {
    
    public void receiveInfo();
}
  1. 具体观察者
public class ObserverA implements MyObserver {

    @Override
    public void receiveInfo() {
        System.out.println("观察者A收到通知!");
    }
}

public class ObserverB implements MyObserver {

    @Override
    public void receiveInfo() {
        System.out.println("观察者B收到通知!");
    }
}

测试:

public static void main(String[] args) throws IOException {
    MyConcreteTitle mct = new MyConcreteTitle();
    MyObserver observerA = new ObserverA();
    MyObserver observerB = new ObserverB();
    mct.addObserver(observerA);
    mct.addObserver(observerB);
    mct.executeNotify();
}

说明:可以发现观察者相对于主题是动态添加的,主题中可以添加任意个观察者,观察者是委托给主题去执行的,相当于主题维护了一个可以增加删除的动态容器来盛装观察者,而主题本身会通知容器中所有的观察者;从而实现观察者模式。还可以发现一旦观察者添加到主题的容器中,不管是否需要都会被推送消息。

总结

  1. 观察者模式中,对于事先通知多少观察者,并不知情,所以观察者数量是不确定。所以说一个对象发生变化,而收到通知的观察者数量是多少是未知的。原因是你都知道是谁收到通知,那不就耦合了嘛!
  2. 适用于一对多的场景,一个发生变化,其他都收到通知也发生变化。
  3. 我们会发现,观察者与主题是解耦的,由于两个东西都和抽象的主题打交道,并不依赖于具体的对象。所以说其中任何一个发生变化,都不会影响其他对象。

你可能感兴趣的:(观察者模式思考)