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