1、什么是观察者模式
    在对对象之间定义了一对多的依赖,这样一来,当一个对象改变状态, 依赖它的对象会收到通知并自动更新。

    2、观察者模式的应用场景
    Zookeeper事件通知节点、消息订阅通知、分布式配置中心

    图片3.png
    抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一 个集合中,每个主题都可以有任意数量的观察者。抽象主题提 供一个接口,可以增加和删除观察者角色。一般用一个抽象类 和接口来实现。

    抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自 己。

    具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有 登记过的观察者发出通知。

    具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制 图的状态

    3、具体实现
    简单实现

    1. //抽象观察者
    2. public interface ObServer {
    3. /**
    4. * 更新消息内容
    5. *
    6. * @param message
    7. * @return
    8. */
    9. public void update(String message);
    10. }
    11. //抽象主题者
    12. public interface AbstractSubject {
    13. /**
    14. * 添加obServer
    15. *
    16. * @param obServer
    17. */
    18. void addObServer(ObServer obServer);
    19. /**
    20. * 移除obServer
    21. *
    22. * @param obServer
    23. */
    24. void removeObServer(ObServer obServer);
    25. /**
    26. * 通知所有的notifyObServerAll
    27. *
    28. * @param message
    29. */
    30. void notifyObServerAll(String message);
    31. /**
    32. * 设置更新内容
    33. */
    34. void setNtifyMessage(String message);
    35. }
    36. //具体主题
    37. public class WeChatSubject implements AbstractSubject {
    38. /**
    39. * 存放所有的ObServer
    40. */
    41. private List<ObServer> listObServer = new ArrayList<ObServer>();
    42. /**
    43. * 更新的内容
    44. */
    45. private String message;
    46. public void addObServer(ObServer obServer) {
    47. listObServer.add(obServer);
    48. }
    49. public void removeObServer(ObServer obServer) {
    50. listObServer.remove(obServer);
    51. }
    52. public void notifyObServerAll(String message) {
    53. for (int i = 0; i < listObServer.size(); i++) {
    54. ObServer obServer = listObServer.get(i);
    55. obServer.update(message);
    56. }
    57. }
    58. public void setNtifyMessage(String message) {
    59. this.message = message;
    60. System.out.println("微信公众号设置message:" + message);
    61. notifyObServerAll(message);
    62. }
    63. }
    64. //具体观察者
    65. public class UserObServer implements ObServer {
    66. /**
    67. * 订阅者用户名称
    68. */
    69. private String name;
    70. /**
    71. * 发送内容
    72. */
    73. private String message;
    74. public UserObServer(String name) {
    75. this.name = name;
    76. }
    77. public void update(String message) {
    78. this.message = message;
    79. read();
    80. }
    81. public void read() {
    82. System.out.println(name + ",老师收到推送消息:" + message);
    83. }
    84. }
    85. //运行测试
    86. // 1.注册主题
    87. AbstractSubject weChatSubject = new WeChatSubject();
    88. // 2.添加观察者 订阅主题
    89. weChatSubject.addObServer(new UserObServer("小薇"));
    90. weChatSubject.addObServer(new UserObServer("小敏"));
    91. // 3.设置发送消息
    92. weChatSubject.setNtifyMessage("好好敲代码,踏踏实实做自己");

    JDK自带观察实现消息发送

    1. //自定义主题
    2. public class MessageObServable extends Observable {
    3. @Override
    4. public void notifyObservers(Object arg) {
    5. // 1.修改状态为可以群发
    6. setChanged();
    7. // 2.调用父类的notifyObservers 群发消息
    8. super.notifyObservers(arg);
    9. }
    10. }
    11. //自定义观察者
    12. public class WechatObServer implements Observer {
    13. public void update(Observable o, Object arg) {
    14. System.out.println("用户下单成功,发送微信体醒内容:" + arg);
    15. }
    16. }
    17. public class EmailObServer implements Observer {
    18. public void update(Observable o, Object arg) {
    19. System.out.println("用户下单成功,发送邮件提醒内容:" + arg);
    20. }
    21. }
    22. public class SmsObServer implements Observer {
    23. public void update(Observable o, Object arg) {
    24. System.out.println("用户下单成功,发送短信提醒内容:" + arg);
    25. }
    26. }
    27. public class TestJdkObServer {
    28. public static void main(String[] args) {
    29. // 1.创建具体的主题
    30. Observable observable = new MessageObServable();
    31. // 2. 注册观察者
    32. observable.addObserver(new SmsObServer());
    33. observable.addObserver(new WechatObServer());
    34. observable.addObserver(new EmailObServer());
    35. // 3.群发消息
    36. observable.notifyObservers("恭喜以1399元购买蚂蚁课堂永久会员一份");
    37. }
    38. /**
    39. * Spring 中项目启动的时候 将这些观察者注册到 主题中 调用notifyObservers群发消息
    40. */
    41. }

    Spring封装事件监听

    1. public class OrderCreateEvent extends ApplicationEvent {
    2. private JSONObject jsonObject;
    3. public OrderCreateEvent(Object source, JSONObject jsonObject) {
    4. super(source);
    5. this.jsonObject = jsonObject;
    6. }
    7. public JSONObject getJsonObject() {
    8. return jsonObject;
    9. }
    10. public void setJsonObject(JSONObject jsonObject) {
    11. this.jsonObject = jsonObject;
    12. }
    13. }
    14. @Component
    15. public class EmailListener implements ApplicationListener<OrderCreateEvent> {
    16. @Override
    17. @Async
    18. public void onApplicationEvent(OrderCreateEvent event) {
    19. System.out.println(Thread.currentThread().getName()+"发送邮件内容:" + event.getJsonObject().toJSONString());
    20. }
    21. }
    22. @Component
    23. public class SmsListener implements ApplicationListener<OrderCreateEvent> {
    24. @Override
    25. @Async
    26. public void onApplicationEvent(OrderCreateEvent event) {
    27. System.out.println(Thread.currentThread().getName() + "发送短信内容:" + event.getJsonObject().toJSONString());
    28. }
    29. }
    30. @RequestMapping("/addOrder")
    31. public String addOrder() {
    32. System.out.println("创建订单...");
    33. // 3.组装消息内容
    34. JSONObject jsonObject = new JSONObject();
    35. jsonObject.put("email", "644064779@qq.com");
    36. jsonObject.put("phone", "15123456789");
    37. jsonObject.put("text", "恭喜您以1399.00元购买蚂蚁课堂永久会员.");
    38. OrderCreateEvent orderCreateEvent = new OrderCreateEvent(this, jsonObject);
    39. applicationContext.publishEvent(orderCreateEvent);
    40. return "success";
    41. }