观察者模式- 2020-11-24 23:08- 设计模式: 设计模式,观察者模式


意在指一对多的关系,即一个目标对多个观察者,多个观察者观察同一个目标,当目标发生改变时,观察者会感知到并且做出相应的处理。 通常observer,event,监听,发布订阅等,都属于观察者模式的实现。

event

监听类

  1. import com.google.common.eventbus.Subscribe;
  2. /**
  3. * 事件监听
  4. *
  5. * @author Bai
  6. * @date 2020/11/24 22:06
  7. */
  8. public class GuavaEvent {
  9. @Subscribe
  10. public void event(String event) {
  11. System.out.println("执行了" + event);
  12. }
  13. }

被监听类

  1. import com.google.common.eventbus.EventBus;
  2. /**
  3. * 被监听类
  4. *
  5. * @author Bai
  6. * @date 2020/11/24 23:13
  7. */
  8. public class GuavaEventBus extends EventBus {
  9. }

测试

  1. @Test
  2. public void test() {
  3. GuavaEventBus eventBus = new GuavaEventBus();
  4. GuavaEvent event = new GuavaEvent();
  5. eventBus.register(event);
  6. eventBus.post("监听");
  7. }

observer

观察者

  1. import java.util.Observable;
  2. import java.util.Observer;
  3. /**
  4. * 观察者
  5. *
  6. * @author Bai
  7. * @date 2020/11/24 22:41
  8. */
  9. public class Cat implements Observer {
  10. @Override
  11. public void update(Observable o, Object arg) {
  12. CatFoodBowl catFoodBowl = (CatFoodBowl) o;
  13. Integer food = (Integer) arg;
  14. System.out.println("在" + catFoodBowl.getName() + "加了" + food + "猫粮后,猫开始吃猫粮了");
  15. }
  16. }

被观察者

  1. import java.util.Observable;
  2. /**
  3. * 猫粮盆 被观察者
  4. *
  5. * @author Bai
  6. * @date 2020/11/24 22:38
  7. */
  8. public class CatFoodBowl extends Observable {
  9. private String name;
  10. private Integer food;
  11. public void addFood(String name, Integer food) {
  12. this.name = name;
  13. System.out.println(name + "加了" + food + "盆猫粮 ");
  14. //false 修改为 true 预示着有变化
  15. setChanged();
  16. //通知所有观察者
  17. notifyObservers(food);
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. }

测试

  1. @Test
  2. public void test() {
  3. CatFoodBowl catFoodBowl = new CatFoodBowl();
  4. Cat cat = new Cat();
  5. catFoodBowl.addObserver(cat);
  6. catFoodBowl.addFood("主人", 1);
  7. }
  1. 主人加了1盆猫粮
  2. 在主人加了1猫粮后,猫开始吃猫粮了