计划模式-观察者模式

[复制链接]
发表于 2025-7-9 05:15:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
观察者模式

也称为订阅—发布模式,在此模式中,一个目标对象管理所有相依于它的观察者对象,而且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用在事故处理系统。
观察者模式利用三个类: Subject(被观察的主体)、Observer(观察者) 和 测试类
Subject的操纵会通知所有注册的Observer,Subject可以添加删除Observer


  • Subject
  1. import java.util.List;
  2. import java.util.Vector;
  3. /**
  4. * 被观察主体
  5. * @Author mubi
  6. * @Date 2020/6/17 09:27
  7. */
  8. public class Subject {
  9.     // 观察者
  10.     private List<Observer> observers = new Vector<>();
  11.     // 观察主体的状态变化
  12.     private int state;
  13.     public int getState() {
  14.         return state;
  15.     }
  16.        
  17.         /**
  18.         自身状态变化后,通知所有的观察者
  19.         */
  20.     public void setState(int state) {
  21.         this.state = state;
  22.         notifyAllObservers();
  23.     }
  24.     public void addObserver(Observer observer){
  25.         observers.add(observer);
  26.     }
  27.     public void delObserver(Observer observer){
  28.         observers.remove(observer);
  29.     }
  30.     public void notifyAllObservers(){
  31.         // 通知观察者,不同观察者执行不同的事情
  32.         for (Observer observer : observers) {
  33.             observer.update();
  34.         }
  35.     }
  36. }
复制代码


  • Observer 抽象类
  1. /**
  2. * @Author mubi
  3. * @Date 2020/6/17 09:27
  4. */
  5. public abstract class Observer {
  6.     protected Subject subject;
  7.     public abstract void update();
  8. }
复制代码


  • 详细的Observer类
  1. /**
  2. * @Author mubi
  3. * @Date 2020/6/17 09:27
  4. */
  5. public class BinaryObserver extends Observer {
  6.     public BinaryObserver(Subject subject) {
  7.         this.subject = subject;
  8.     }
  9.     @Override
  10.     public void update() {
  11.         System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
  12.     }
  13. }
复制代码
  1. /**
  2. * @Author mubi
  3. * @Date 2020/6/17 09:28
  4. */
  5. public class OctalObserver extends Observer {
  6.     public OctalObserver(Subject subject) {
  7.         this.subject = subject;
  8.     }
  9.     @Override
  10.     public void update() {
  11.         System.out.println("Octal String: " + Integer.toOctalString(subject.getState()));
  12.     }
  13. }
复制代码


  • 测试
  1. /**
  2. * @Author mubi
  3. * @Date 2020/6/17 09:32
  4. */
  5. public class DesignTest {
  6.     public static void main(String[] args) {
  7.         Subject subject = new Subject();
  8.         Observer observer1 = new BinaryObserver(subject);
  9.         Observer observer2 = new OctalObserver(subject);
  10.         subject.addObserver(observer1);
  11.         subject.addObserver(observer2);
  12.         subject.setState(10);
  13.         System.out.println();
  14.         subject.setState(12);
  15.         System.out.println();
  16.         subject.delObserver(observer1);
  17.         subject.setState(13);
  18.         System.out.println();
  19.     }
  20. }
复制代码
输出:
  1. Binary String: 1010
  2. Octal String: 12
  3. Binary String: 1100
  4. Octal String: 14
  5. Octal String: 15 // 因为此前删除了 BinaryObserver
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-7-25 08:08 , Processed in 0.082417 second(s), 30 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表