java 设计模式之观察者模式

£神魔★判官ぃ 2022-03-26 03:48 282阅读 0赞

观察者模式的定义:

  在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。

结构图:

1272523-20171113100406343-149515793.png

3、可以看到,该模式包含四个角色

  • 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
  • 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  • 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
  • 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

4.Java代码演示

1.定义被观察者接口

  1. package com.summer.observer;
  2. /**
  3. * @ClassName: Observable
  4. * @Description:被观察者接口
  5. * @author: summer
  6. * @date: 2019年1月14日 下午5:20:54
  7. *
  8. */
  9. public interface Observable {
  10. /**
  11. * @Title: registObserver
  12. * @Description: 添加观察者
  13. * @param observer
  14. * @return: void
  15. * @throws
  16. */
  17. public void registObserver(Observer observer);
  18. /**
  19. * @Title: removeObserver
  20. * @Description: 删除观察者
  21. * @param observer
  22. * @return: void
  23. * @throws
  24. */
  25. public void removeObserver(Observer observer);
  26. /**
  27. * @Title: notify
  28. * @Description: 通知所有观察者
  29. * @param message
  30. * @return: void
  31. * @throws
  32. */
  33. public void notify(String message);
  34. }

2.定义观察者接口

  1. package com.summer.observer;
  2. /**
  3. * @ClassName: Observer
  4. * @Description:定义观察者接口
  5. * @author: summer
  6. * @date: 2019年1月14日 下午5:20:37
  7. *
  8. */
  9. public interface Observer {
  10. public void dosomething(String message);
  11. }

3.定义被观察者实现类,这里使用微信公众号的方式,公众号就是被观察者,普通微信用户就是观察者,只有关注了公众号才可以收到公众号的消息

  1. package com.summer.observer;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * @ClassName: WetChatServer
  6. * @Description:被观察者,微信公众号
  7. * @author: summer
  8. * @date: 2019年1月15日 下午2:50:49
  9. *
  10. */
  11. public class WetChatServer implements Observable {
  12. private List<Observer> observers = new ArrayList<>();
  13. public List<Observer> getObservers() {
  14. return observers;
  15. }
  16. public void setObservers(List<Observer> observers) {
  17. this.observers = observers;
  18. }
  19. public WetChatServer(List<Observer> observers) {
  20. super();
  21. this.observers = observers;
  22. }
  23. @Override
  24. public void registObserver(Observer observer) {
  25. if(!observers.contains(observer)){
  26. observers.add(observer);
  27. }
  28. }
  29. @Override
  30. public void removeObserver(Observer observer) {
  31. if(observers.contains(observer)){
  32. observers.remove(observer);
  33. }
  34. }
  35. @Override
  36. public void notify(String message) {
  37. for (Observer observer : observers) {
  38. observer.dosomething(message);
  39. }
  40. }
  41. }

4.定义观察者,可以定义多个,实现Observer接口。这里省略

  1. package com.summer.observer;
  2. public class Client01 implements Observer {
  3. @Override
  4. public void dosomething(String message) {
  5. System.out.println("Client01收到了消息:"+message);
  6. }
  7. }

5.编写测试类

  1. package com.summer.observer;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class TestObserver {
  5. public static void main(String[] args) {
  6. List<Observer> observers = new ArrayList<>();
  7. WetChatServer wetChatServer = new WetChatServer(observers);
  8. Client01 client01 = new Client01();
  9. Client02 client02 = new Client02();
  10. Client03 client03 = new Client03();
  11. //订阅了公众号
  12. wetChatServer.registObserver(client01);
  13. wetChatServer.registObserver(client02);
  14. wetChatServer.registObserver(client03);
  15. String message = "微信公众号更新消息了:2019,你好";
  16. System.out.println("服务器发布消息:"+message);
  17. wetChatServer.notify(message);
  18. //client03取消关注
  19. System.out.println("##############################################");
  20. wetChatServer.removeObserver(client03);
  21. wetChatServer.notify(message);
  22. }
  23. }

运行结果:

服务器发布消息:微信公众号更新消息了:2019,你好
Client01收到了消息:微信公众号更新消息了:2019,你好
Client02收到了消息:微信公众号更新消息了:2019,你好
Client03收到了消息:微信公众号更新消息了:2019,你好
##############################################
Client01收到了消息:微信公众号更新消息了:2019,你好
Client02收到了消息:微信公众号更新消息了:2019,你好

发表评论

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

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

相关阅读

    相关 Java 设计模式观察模式

    一、了解观察者模式 1.1 什么是观察者模式 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新。 典型的问

    相关 JAVA设计模式观察模式

    1、初步认识 观察者模式的定义:   在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。 大白话:   其实就是