• 设计模式之观察者模式


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

     

    • 自己实现观察者模式

     观察者的接口

    1. package com.example.demodesign00;
    2. /**
    3. * @author lzb
    4. * @date 2022/7/30 11:16
    5. *
    6. */
    7. public interface Observer {
    8. /**
    9. *
    10. */
    11. void update(String msg);
    12. }

     被观察者的接口

    1. package com.example.demodesign00;
    2. /**
    3. * @author lzb
    4. * @date 2022/7/30 10:31
    5. */
    6. public interface Subject {
    7. /**
    8. * 注册一个观察者
    9. * @param observer
    10. */
    11. void registerObserver(Observer observer);
    12. /**
    13. * 移除一个观察者
    14. * @param observer
    15. */
    16. void removeObserver(Observer observer);
    17. /**
    18. * 通知所有的观察者
    19. */
    20. void notifyObserver();
    21. }

    具体的被观察者

    1. package com.example.demodesign00;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. /**
    5. * @author lzb
    6. * @date 2022/7/30 11:17
    7. */
    8. public class CreateSubject implements Subject{
    9. /**
    10. * 观察者列表
    11. */
    12. private List observerList = new ArrayList<>();
    13. public void setMsg(String msg) {
    14. this.msg = msg;
    15. notifyObserver();
    16. }
    17. private String msg;
    18. @Override
    19. public void registerObserver(Observer observer) {
    20. observerList.add(observer);
    21. }
    22. @Override
    23. public void removeObserver(Observer observer) {
    24. int i = observerList.indexOf(observer);
    25. if(i>=0){
    26. observerList.remove(i);
    27. }
    28. }
    29. @Override
    30. public void notifyObserver() {
    31. for (Observer observer:observerList) {
    32. observer.update(msg);
    33. }
    34. }
    35. }

    观察者1号。对被观察者进行关注 

    1. package com.example.demodesign00;
    2. /**
    3. * @author lzb
    4. * @date 2022/7/30 11:17
    5. */
    6. public class CreateObserver implements Observer{
    7. private Subject subject;
    8. public CreateObserver(Subject subject){
    9. this.subject = subject;
    10. subject.registerObserver(this);
    11. }
    12. @Override
    13. public void update(String msg) {
    14. System.out.println("获得号码"+msg+"记下来");
    15. }
    16. }

    观察者二号,也观察了CreateSubject

    1. package com.example.demodesign00;
    2. /**
    3. * @author lzb
    4. * @date 2022/7/30 12:27
    5. */
    6. public class CreateObserver1 implements Observer{
    7. private Subject subject;
    8. //构造方法中注册
    9. public CreateObserver1(Subject subject){
    10. this.subject = subject;
    11. //将自己这个观察者 注册 主题中。
    12. subject.registerObserver(this);
    13. }
    14. @Override
    15. public void update(String msg) {
    16. System.out.println("我是第二个观察者,收到的消息是:"+msg);
    17. }
    18. }
    1. package com.example.demodesign00;
    2. /**
    3. * @author lzb
    4. * @date 2022/7/30 12:35
    5. */
    6. public class Test {
    7. public static void main(String[] args) {
    8. CreateSubject createSubject = new CreateSubject();
    9. CreateObserver createObserver = new CreateObserver(createSubject);
    10. CreateObserver1 createObserver1 = new CreateObserver1(createSubject);
    11. createSubject.setMsg("好好学习,天天向上");
    12. }
    13. }

    具体运行结果:

     以上就是自己实现的观察者模式,但是,当然了java中已经帮我们实现了观察者模式,借助于java.util.Observable和java.util.Observer。


    • 用java自带的观察者设计模式实现

    观察者1号,这里观察者,不只观察3d,还观察了双色球类,实现了多观察

    1. package com.example.demodesign01;
    2. import java.util.Observable;
    3. import java.util.Observer;
    4. /**
    5. * @author lzb
    6. * @date 2022/7/30 12:59
    7. * 观察者
    8. */
    9. public class Observer1 implements Observer {
    10. public void registerSubject(Observable observable){
    11. observable.addObserver(this);
    12. }
    13. @Override
    14. public void update(Observable o, Object arg) {
    15. if( o instanceof SubjectFor3d){
    16. SubjectFor3d subjectFor3d = (SubjectFor3d) o;
    17. System.out.println("3d"+subjectFor3d.getMsg());
    18. }
    19. if( o instanceof SubjectForSSQ ){
    20. SubjectForSSQ subjectForSSQ = (SubjectForSSQ) o;
    21. System.out.println("ssq"+subjectForSSQ.getMsg());
    22. }
    23. }
    24. }

    被观察者,3d类

    1. package com.example.demodesign01;
    2. import java.util.Observable;
    3. /**
    4. * @author lzb
    5. * @date 2022/7/30 12:53
    6. * 3d 主题类
    7. */
    8. public class SubjectFor3d extends Observable {
    9. public String getMsg() {
    10. return msg;
    11. }
    12. public void setMsg(String msg) {
    13. this.msg = msg;
    14. //值的变更
    15. setChanged();
    16. //变更后通知
    17. notifyObservers();
    18. }
    19. private String msg;
    20. }

    被观察者2号,双色球类

    1. package com.example.demodesign01;
    2. import java.util.Observable;
    3. /**
    4. * @author lzb
    5. * @date 2022/7/30 12:57
    6. */
    7. public class SubjectForSSQ extends Observable {
    8. public String getMsg() {
    9. return msg;
    10. }
    11. public void setMsg(String msg) {
    12. this.msg = msg;
    13. //设置值
    14. setChanged();
    15. //设置值之后的通知
    16. notifyObservers();
    17. }
    18. private String msg;
    19. }

    运行结果 

    1. package com.example.demodesign01;
    2. /**
    3. * @author lzb
    4. * @date 2022/7/30 12:51
    5. */
    6. public class Test {
    7. public static void main(String[] args) {
    8. SubjectForSSQ subjectForSSQ = new SubjectForSSQ();
    9. Observer1 observer1 = new Observer1();
    10. observer1.registerSubject(subjectForSSQ);
    11. subjectForSSQ.setMsg("双色球开奖号码:1233423");
    12. SubjectFor3d subjectFor3d = new SubjectFor3d();
    13. observer1.registerSubject(subjectFor3d);
    14. subjectFor3d.setMsg("3d开奖号码:123123");
    15. }
    16. }

    输出结果

    1. ssq双色球开奖号码:1233423
    2. 3d3d开奖号码:123123
    • SpingBoot 实现观察者模式

    后面补充

  • 相关阅读:
    netty面试题及答案
    浅谈必应bing搜索国内广告开户流程
    mysql备份数据库linux
    Android | Handler
    OpenCV鼠标绘制线段
    操作系统进程调度算法的模拟实现(c语言版本)
    零基础10 天入门 Web3之第2天
    vue--配置根目录(用@代表src目录)
    正大杯市场调查与分析大赛|赛前准备 持续更新ing
    Javascript笔记
  • 原文地址:https://blog.csdn.net/qq_28423997/article/details/126072904