JAVA设计模式——观察者模式

向右看齐 2022-03-30 05:25 350阅读 0赞

前言:

观察者模式,又可以称之为发布-订阅模式,顾名思义,简而言之我们可以理解成,7点半播放天气预报,电视里那个主持人就是发布者,也就是所谓的被观察者,我们这些听天气预报的人也就是所谓的观察者。也就是说他一个人(被观察者)发布一条消息,我们这些听天气预报的人(观察者)都知道了这个消息。

1,被观察者接口(也就是天气预报主持人的接口,每天可以换主持人播报):

  1. package com.itpengwei.design;
  2. /**
  3. * @author 彭伟
  4. * @Date 2019/1/4 20:30
  5. * 被观察者接口
  6. * 声明了添加,删除,通知观察者方法
  7. */
  8. public interface Observerable {
  9. /**
  10. * @param observer 抽象观察者
  11. * 添加观察者
  12. */
  13. void registerObserver(Observer observer);
  14. /**
  15. * @param observer 抽象观察者
  16. * 删除观察者
  17. */
  18. void removeObserver(Observer observer);
  19. /**
  20. * 通知观察者
  21. */
  22. void notifyObserver();
  23. }

2,消费者的接口(也就是所谓的收听天气预报的所有人统称为收听者)

  1. package com.itpengwei.design;
  2. /**
  3. * @author 彭伟
  4. * @Date 2019/1/4 20:32
  5. * 观察者接口,收听天气预报的人的统称
  6. */
  7. public interface Observer {
  8. /**
  9. * @param msg 消息
  10. * 生产者发布通知,接口进行回调
  11. */
  12. void update(String msg);
  13. }

3,被观察者实现(天气预报主持人)

  1. package com.itpengwei.design;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * @author 彭伟
  6. * @Date 2019/1/4 20:54
  7. * 被观察者,也就是天气预报总站
  8. * 实现了Oberverable接口,对它进行了一个实现
  9. */
  10. public class WeacherServer implements Observerable {
  11. /**
  12. * 装所有消费者
  13. */
  14. private List<Observer> list;
  15. private String msg;
  16. public WeacherServer() {
  17. list = new ArrayList<Observer>();
  18. }
  19. @Override
  20. public void registerObserver(Observer observer) {
  21. list.add(observer);
  22. }
  23. @Override
  24. public void removeObserver(Observer observer) {
  25. if (!list.isEmpty()) {
  26. list.remove(observer);
  27. }
  28. }
  29. @Override
  30. public void notifyObserver() {
  31. for (Observer observer : list) {
  32. observer.update(msg);
  33. }
  34. }
  35. /**
  36. * @param s 发送消息内容
  37. * 发送消息方法
  38. */
  39. public void sendmsg(String s) {
  40. this.msg = s;
  41. System.out.println("----生产者生产的新消息-------");
  42. //消息更新,通知所有观察者
  43. notifyObserver();
  44. }
  45. }

4,消费者具体实现

  1. package com.itpengwei.design;
  2. /**
  3. * @author 彭伟
  4. * @Date 2019/1/4 21:02
  5. * 消费者,也就是听天气预报的人
  6. */
  7. public class Consumer implements Observer {
  8. private String username;
  9. public Consumer(String username) {
  10. this.username = username;
  11. }
  12. @Override
  13. public void update(String msg) {
  14. System.out.println("----"+this.username+"----" + msg);
  15. }
  16. }

5,测试类

  1. import com.itpengwei.design.Consumer;
  2. import com.itpengwei.design.Observer;
  3. import com.itpengwei.design.WeacherServer;
  4. public class Main {
  5. public static void main(String[] args) {
  6. WeacherServer server = new WeacherServer();
  7. Observer userzhang = new Consumer("张三");
  8. Observer userlisi = new Consumer("李四");
  9. Observer userwangwu = new Consumer("王五");
  10. server.registerObserver(userzhang);
  11. server.registerObserver(userlisi);
  12. server.registerObserver(userwangwu);
  13. //第一次发消息,消费者为3个人
  14. server.sendmsg("今天晴,气温27℃");
  15. //第二次推送消息,消费者为4个人,加了个赵六
  16. System.out.println("----添加了赵六后总共有4个消费者了--------");
  17. Observer userzhaoliu = new Consumer("赵六");
  18. server.registerObserver(userzhaoliu);
  19. server.sendmsg("今天下雨,气温23℃");
  20. }
  21. }

6,测试结果

7,总结" class="reference-link">watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B3MTkxNDEwMTQ3_size_16_color_FFFFFF_t_707,总结

通过上面的实例可以很明显的看出,观察者模式的大概模型,关键是什么呢?

  1、针对观察者与被观察者分别定义接口,有利于分别进行扩展。

  2、重点就在被观察者的实现中:

   (1)定义观察者集合,并定义针对集合的添加、删除操作,用于增加、删除订阅者(观察者)

   (2)定义通知方法,用于将新情况通知给观察者用户(订阅者用户)

  3、观察者中需要有个接收被观察者通知的方法。

观察者模式定义的是一对多的依赖关系,一个被观察者可以拥有多个观察者,并且通过接口对观察者与被观察者进行逻辑解耦,降低二者的直接耦合。

发表评论

表情:
评论列表 (有 0 条评论,350人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java设计模式 ---- 观察模式

    一,观察者模式     观察者模式又名发布-订阅模式,定义了对象之间的一对多依赖,多个对象同时监听一个对象,当被监听对象的状态发生改变时,它的所有依赖者都会收到通知并自动更新

    相关 java设计模式-观察模式

    1.观察者模式 观察者模式(Observer),即多个观察者对象监听一个共同的主题对象,是一种一对多的依赖关系。当被观察的主题对象发生改变时,会通过回掉函数通知所有关注自

    相关 JAVA设计模式——观察模式

    前言: 观察者模式,又可以称之为发布-订阅模式,顾名思义,简而言之我们可以理解成,7点半播放天气预报,电视里那个主持人就是发布者,也就是所谓的被观察者,我们这些听天气预报