观察者模式

  

  定义

  观察者模式:定义了一种对象间的一对多依赖关系,一旦被依赖对象改变状态,所有观察者都会得到通知并自动更新

  实例

  我们在日常生活中,微信公众号的运作模式便是典型的观察者模式的实现,一旦公众号新推了内容,所有关注公众号的账号都会得到通知。

  优缺点

  观察者模式的优点是可以实现表示层与数据逻辑层的分离,可以在观察者与被观察者之间建立一个抽象的耦合,支持广播通信。

  缺点是如果一个观察者的被观察者太多的话,通知动作会花费大量的时间。而且如果观察者与被观察者之间存在循环依赖的话,观察目标可能会触发它们的循环调用,造成系统崩溃。

  类图

 

 

   被观察者维护着一个观察者的集合,在有事件时循环通知集合中的观察者。

  被观察者抽象规定了被观察者的行为,必须包括:新增观察者、删除观察者、通知观察者。

  观察者抽象规定了观察者的行为,必须包括:接收通知。

  示例

  观察者抽象:

/**
*   @Author Nyr
*   @Date 2019/11/26 19:21
*   @Description 观察者抽象
*/
public interface Obsever {
    /**
    *   @Author Nxy
    *   @Date 2019/11/26 19:21
    *   @Param msg:通知消息
    *   @Return
    *   @Exception
    *   @Description 接收观察者通知的方法
    */
    public void update(String msg);
}

  被观察者抽象:

/**
 * @Author Nyr
 * @Date 2019/11/26 19:23
 * @Description 被观察者抽象
 */
public interface Subject {
    /**
     * @Author Nxy
     * @Date 2019/11/26 19:24
     * @Param o:观察者对象
     * @Return
     * @Exception
     * @Description 新增观察者对象
     */
    public void addObserver(Obsever o);

    /**
     * @Author Nxy
     * @Date 2019/11/26 19:25
     * @Param o:观察者对象
     * @Return
     * @Exception
     * @Description 删除观察者对象
     */
    public void removeObserver(Obsever o);

    /**
     * @Author Nxy
     * @Date 2019/11/26 19:26
     * @Param msg:通知信息
     * @Return
     * @Exception
     * @Description 通知所有观察者
     */
    public void notifyObservers(String msg);
}

  被观察者实例:

public class ConcreteSubject implements Subject {
    //观察者集合
    private List<Obsever> obsevers=new LinkedList<>();
    /**
     * @Author Nxy
     * @Date 2019/11/26 19:24
     * @Param o:观察者对象
     * @Return
     * @Exception
     * @Description 新增观察者对象
     */
    @Override
    public void addObserver(Obsever o){
        obsevers.add(o);
    }

    /**
     * @Author Nxy
     * @Date 2019/11/26 19:25
     * @Param o:观察者对象
     * @Return
     * @Exception
     * @Description 删除观察者对象
     */
    @Override
    public void removeObserver(Obsever o){
        obsevers.remove(o);
    }

    /**
     * @Author Nxy
     * @Date 2019/11/26 19:26
     * @Param msg:通知信息
     * @Return
     * @Exception
     * @Description 通知所有观察者
     */
    @Override
    public void notifyObservers(String msg){
        for(Obsever o:obsevers){
            o.update(msg);
        }
    }
}

  观察者实例:

public class ConcreteObserver implements Obsever {
    @Override
    public void update(String msg){
        System.out.println("消费者  "+this.hashCode()+"  收到通知:  "+msg);
    }
}

  Demo

public class Demo {
    public static void main(String[] args) {
        Subject s = new ConcreteSubject();
        Obsever o0 = new ConcreteObserver();
        Obsever o1 = new ConcreteObserver();
        Obsever o2 = new ConcreteObserver();
        Obsever o3 = new ConcreteObserver();
        Obsever o4 = new ConcreteObserver();
        Obsever o5 = new ConcreteObserver();
        //注册观察者
        s.addObserver(o0);
        s.addObserver(o1);
        s.addObserver(o2);
        s.addObserver(o3);
        s.addObserver(o4);
        s.addObserver(o5);
        //通知所有观察者
        s.notifyObservers("通知1");
    }
}

  六个观察者都收到了通知:

 

posted @ 2019-11-26 19:43  牛有肉  阅读(246)  评论(0编辑  收藏  举报