核心:

    1. 观察者模式主要用于1:N的通知,当一个对象(目标对象Subject或者Observable)的状态发生变化时,它需要及时告知一系列对象(观察者对象,Observer),令他们作出响应
    2. ---通知观察者的方式
    3. 每次都会把通知以广播方式发送给所有观察者,所有观察者只能被动接收
    4. 观察者只要直到有情况即可,至于什么时候获取内容,获取什么内容,都可以主动决定

    具体代码

    1、定义一个抽象被观察者接口

    1. package com.jstao.observer;
    2. /***
    3. * 抽象被观察者接口
    4. * 声明了添加、删除、通知观察者方法
    5. * @author jstao
    6. *
    7. */
    8. public interface Observerable {
    9. public void registerObserver(Observer o);
    10. public void removeObserver(Observer o);
    11. public void notifyObserver();
    12. }

    2、定义一个抽象观察者接口

    1. package com.jstao.observer;
    2. /***
    3. * 抽象观察者
    4. * 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
    5. * @author jstao
    6. *
    7. */
    8. public interface Observer {
    9. public void update(String message);
    10. }

    3、定义被观察者,实现了Observerable接口,对Observerable接口的三个方法进行了具体实现,同时有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可。

    1. package com.jstao.observer;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. /**
    5. * 被观察者,也就是微信公众号服务
    6. * 实现了Observerable接口,对Observerable接口的三个方法进行了具体实现
    7. * @author jstao
    8. *
    9. */
    10. public class WechatServer implements Observerable {
    11. //注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程
    12. private List<Observer> list;
    13. private String message;
    14. public WechatServer() {
    15. list = new ArrayList<Observer>();
    16. }
    17. @Override
    18. public void registerObserver(Observer o) {
    19. list.add(o);
    20. }
    21. @Override
    22. public void removeObserver(Observer o) {
    23. if(!list.isEmpty())
    24. list.remove(o);
    25. }
    26. //遍历
    27. @Override
    28. public void notifyObserver() {
    29. for(int i = 0; i < list.size(); i++) {
    30. Observer oserver = list.get(i);
    31. oserver.update(message);
    32. }
    33. }
    34. public void setInfomation(String s) {
    35. this.message = s;
    36. System.out.println("微信服务更新消息: " + s);
    37. //消息更新,通知所有观察者
    38. notifyObserver();
    39. }
    40. }

    4、定义具体观察者,微信公众号的具体观察者为用户User

    1. package com.jstao.observer;
    2. /**
    3. * 观察者
    4. * 实现了update方法
    5. * @author jstao
    6. *
    7. */
    8. public class User implements Observer {
    9. private String name;
    10. private String message;
    11. public User(String name) {
    12. this.name = name;
    13. }
    14. @Override
    15. public void update(String message) {
    16. this.message = message;
    17. read();
    18. }
    19. public void read() {
    20. System.out.println(name + " 收到推送消息: " + message);
    21. }
    22. }

    5、编写一个测试类

    1. package com.jstao.observer;
    2. public class Test {
    3. public static void main(String[] args) {
    4. WechatServer server = new WechatServer();
    5. Observer userZhang = new User("ZhangSan");
    6. Observer userLi = new User("LiSi");
    7. Observer userWang = new User("WangWu");
    8. server.registerObserver(userZhang);
    9. server.registerObserver(userLi);
    10. server.registerObserver(userWang);
    11. server.setInfomation("PHP是世界上最好用的语言!");
    12. System.out.println("----------------------------------------------");
    13. server.removeObserver(userZhang);
    14. server.setInfomation("JAVA是世界上最好用的语言!");
    15. }
    16. }