观察者模式

观察者模式

  • 在软件构建过程中,我们需要为某些对象建立一种”通知依赖关系”,即一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象)都将得到通知.观察者模式定义了对象之间一对多的依赖,当一个对象状态发生改变时,它的依赖者都会收到通知并自动更新相关内容.

    观察者模式要点总结

  • 使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合
  • 目标发送通知时,无需指定观察者,通知(可以携带通知信息所为参数)会自动传播
  • 观察者自己决定是否需要订阅通知,目标对象对此一无所知

    代码例子

  • 以报社问题为原型,来描述一个观察者的应用场景
    1
    2
    3
    4
    //观察者接口
    public interface IObserver {
    void update(String msg);
    }
    1
    2
    3
    4
    5
    6
    7
    //主题接口
    public interface ISubject {
    void registerObserver(IObserver observer);
    void removeObserver(IObserver observer);
    void notifyObserver();
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    //报社主题
    public class NewPaperOffice implement ISubject {
    private int time = 1;
    private List<IObserver> mList = new ArrayList();

    @Override
    public void registerObserver(IObserve observer){
    if(observer != null)
    mList.add(observer);
    }

    @override
    public void removeObserver(IObserver obsrever){
    mList.remove(observer);
    }

    @Ovserride
    public void notifyObserver(){
    for(int i=0;i<mList;i++){
    String msg = "通知观察者"
    mList.get(i).update(msg);
    }
    }

    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    //观察者实现
    public class FirstObserver implement IObserver{
    private String message;

    public String getMsg(){
    return msg;
    }

    @Override
    public void update(String msg){
    message = "FirstObserver 收到了" + msg;
    }

    }

    public class SecondObserver implements IObserver {//观察者实现
    private String message;

    public String getMessage() {
    return message;
    }

    @Override
    public void update(String msg) {
    message = "SecondObserver 收到了" + msg;
    }
    }