设计模式之观察者模式--中英文结合理解版

1.为什么要用到观察者模式,他能给我们什么好处。

   举个例子,一个老师,要布置作业,该如何通知班里的学生呢?第一种方法,去教室、食堂、厕所等地一个个找到学生,然后通知学生们作业。这种方法显然是不现实的。那我们在上学时,是如何得知作业的呢?首先所有学生到教室后,都听老师布置的作业。这样,解放了老师。这里用的这种思想,就是观察者模式。

2.我们来画一下上述的流程图:

  

3.代码实现如下:

  1)抽象观察者:

public interface Observer {
    /**
     * 接受消息
     */
    public void update(String message);
}

  2)抽象被观察者:

public interface Subject{
    /**
     * 注册观察者
     */
    public void registerObserver(Observer o);
    /**
     * 移除观察者
     */
    public void removeObserver(Observer o);
    /**
     * 通知消息
     */
    public void notifyObserver();

}

  3)学生: 

public class Student implements Observer {
   
    private String name;  
    private String message; //观察者需要的消息

    public Student(String name) {
        this.name = name;
    }

    public void read() {
        System.out.println(name+"收到消息为:"+message);
    }
    //接受消息的实现
    @Override
    public void update(String message) {
        this.message = message;
        read();

    }
}

  4)老师:

public class Teacher implements Subject {

    //注意这个List集合的泛型为Observer接口,设计原则:面向接口编程,而不是面向实现编程
    private List<Observer> list;
    //通知的内容
    private String message;
    //constructor
    Teacher() {
        list = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer o) {
        list.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        if (!list.isEmpty()) {
            list.remove(o);
        }
    }

    @Override
    public void notifyObserver() {
        for(Observer observer : list) {
            observer.update(message);
        }
    }

    /**
     * 设置信息的时候就全都通知了
     */
    public void setInfomation(String s) {
        this.message = s;
        System.out.println("服务更新消息:" + s);
        notifyObserver();
    }
}

  5)调用:

public class Main {
    public static void main(String[] args) {
        Teacher server = new Teacher();
        Observer zhaopd= new Student("zhaopd");
        Observer chenmy= new Student("chenmy");
        Observer chzh= new Student("chzh");
        server.registerObserver(zhaopd);
        server.registerObserver(chenmy);
        server.registerObserver(chzh);
        server.setInfomation("Java 是世界上最好的语言");

        System.out.println("-------------------");

        server.removeObserver(chzh);
        server.setInfomation("我说谎了");
    }
}

4.关于观察者模式和发布-订阅模式:

  我个人以为是不一样的...区别是一个发布-订阅有调度中心,观察者模式没有,相当于一个是老师在黑板上留言通知,一个是直接喊话通知。

原文地址:https://www.cnblogs.com/zpdMulti/p/596957458_qq19.html