设计模式之观察者模式

╰+攻爆jí腚メ 2022-10-06 09:50 86阅读 0赞

1、测试主类

  1. public class TestSubjectObserver {
  2. public static void main(String[] args) {
  3. // 1.创建目标
  4. SubjectWeather subjectWeather = new SubjectWeather();
  5. // 2.创建观察者
  6. ObserverGirl observerGirl = new ObserverGirl("朋友:", "明天约会,地点大运河公园,不见不散哦");
  7. ObserverMom observerMum = new ObserverMom("老妈:", "明天购物,地点大润发超市");
  8. // 3.注册观察者
  9. subjectWeather.attach(observerGirl);
  10. subjectWeather.attach(observerMum);
  11. // 4.目标发布天气
  12. subjectWeather.pushWeatherContent("明天,天气晴朗,蓝天白云,气温28℃");
  13. subjectWeather.pushWeatherContent("明天,大到暴雨");
  14. }
  15. }

2、观察者接口

  1. /**
  2. * 观察者接口,定义一个更新的接口给那些在目标对象发生改变的时候被通知的对象
  3. */
  4. public interface Observer {
  5. /**
  6. * 更新的接口
  7. * @param subject 传入的目标对象,方便获取相应的目标对象的状态
  8. */
  9. void receive(Subject subject);
  10. }

3、观察者一朋友

  1. /**
  2. * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致
  3. */
  4. public class ObserverGirl implements Observer {
  5. //观察者的名称,是谁收到了这个信息
  6. private String observerName;
  7. //天气的内容信息,这个消息从目标处获取
  8. private String weatherContent;
  9. //提醒的内容,不同的观察者提醒不同的内容
  10. private String remindThing;
  11. public ObserverGirl(String observerName, String remindThing) {
  12. this.observerName = observerName;
  13. this.remindThing = remindThing;
  14. }
  15. //获取目标类的状态同步到观察者的状态中
  16. @Override
  17. public void receive(Subject subject) {
  18. weatherContent = ((SubjectWeather) subject).getWeatherContent();
  19. System.out.println(observerName + " 收到了天气信息【" + weatherContent + "】;准备去做:" + remindThing);
  20. }
  21. }

4、观察者二妈妈

  1. /**
  2. * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致
  3. */
  4. public class ObserverMom implements Observer {
  5. //观察者的名称,是谁收到了这个信息
  6. private String observerName;
  7. //天气的内容信息,这个消息从目标处获取
  8. private String weatherContent;
  9. //提醒的内容,不同的观察者提醒不同的内容
  10. private String remindThing;
  11. public ObserverMom(String observerName, String remindThing) {
  12. this.observerName = observerName;
  13. this.remindThing = remindThing;
  14. }
  15. //获取目标类的状态同步到观察者的状态中
  16. @Override
  17. public void receive(Subject subject) {
  18. weatherContent = ((SubjectWeather) subject).getWeatherContent();
  19. System.out.println(observerName + " 收到了天气信息【" + weatherContent + "】;准备去做:" + remindThing);
  20. }
  21. }

5、目标对象父类

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. /**
  4. * 目标类,目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口
  5. */
  6. public class Subject {
  7. /**
  8. * 用来保证注册的观察者对象
  9. */
  10. private List<Observer> observers = new ArrayList<Observer>();
  11. /**
  12. * 增加观察者
  13. */
  14. public void attach(Observer observer) {
  15. observers.add(observer);
  16. }
  17. /**
  18. * 删除指定的观察者
  19. */
  20. public void detach(Observer observer) {
  21. observers.remove(observer);
  22. }
  23. /**
  24. * 通过所有注册的观察者对象
  25. */
  26. protected void notifyObserver() {
  27. observers.forEach(observer -> {
  28. observer.receive(this);
  29. });
  30. }
  31. }

6、目标对象具象类

  1. /**
  2. * 具体的目标对象,负责把有关状态存入到相应的观察者对象中
  3. */
  4. @Data
  5. public class SubjectWeather extends Subject {
  6. /**
  7. * 获取天气的内容信息
  8. */
  9. private String weatherContent;
  10. public void pushWeatherContent(String weatherContent) {
  11. this.weatherContent = weatherContent;
  12. // 内容有了,说明天气更新了,通知所有订阅的人
  13. this.notifyObserver();
  14. }
  15. }

7、输出结果

  1. 朋友: 收到了天气信息【明天,天气晴朗,蓝天白云,气温28℃】;准备去做:明天约会,地点大运河公园,不见不散哦
  2. 老妈: 收到了天气信息【明天,天气晴朗,蓝天白云,气温28℃】;准备去做:明天购物,地点大润发超市
  3. 朋友: 收到了天气信息【明天,大到暴雨】;准备去做:明天约会,地点大运河公园,不见不散哦
  4. 老妈: 收到了天气信息【明天,大到暴雨】;准备去做:明天购物,地点大润发超市

学习参考:

https://www.imooc.com/learn/415

发表评论

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

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

相关阅读

    相关 设计模式观察模式

    观察者模式 什么是观察者模式 观察者模式属于行为模式的一种,定义了对象的通用交流方式。 观察者模式定义了一对多的关系,一个对象改变了状态,则其它所有依赖

    相关 设计模式观察模式

    前言 使用场景: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟

    相关 设计模式观察模式

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 即目标发生更

    相关 设计模式观察模式

    定义 当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。观察者模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步

    相关 设计模式观察模式

     今天放假,又有时间继续啃《java设计模式》这本书了。每次学会一种设计模式内心都会有一种小小的成就感,但是懂是懂了,不知道会不会用。主要是现在没有什么项目经验,设计模式学了也

    相关 设计模式观察模式

    [上一篇:设计模式之策略模式][Link 1] 故事要从气象站说起,气象站有个WeatherData对象,这个对象负责拿到所有的气象数据(温度、湿度、气压),而气象站同时也

    相关 设计模式观察模式

    1 观察者模式 当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都

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

    > 设计模式: > > 前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案