• 设计模式之观察者模式


    观察者模式又称为发布/订阅(Publish/Subscribe)模式,因此我们可以用QQ群说明:

    群主@全体成员,只要狗群主@了全体成员你就会收到一条信息,这样可以理解为:狗群主 被观察者对象,群员 观察者对象。他俩的关系就是一对多的关系。MQ主要的设计模式就是观察者模式

    手写观察者:

      

    package com.example.demo;
    
    
    //被观察者
    public interface Subject {
        //添加观察者
        void addService(Object obj);
        //删除观察者
        void disService(Object obj);
        //通知所有观察者
        void notifyObserver();
    }
    package com.example.demo;
    
    //观察者
    public interface ObServce {
        //当主题状态改变时,会将一个String类型字符传入该方法的参数,每个观察者都需要实现该方法
        void update(String info);
    }
    package com.example.demo;
    
    import java.util.ArrayList;
    import java.util.List;
    
    //被观察者实现
    public class TeacherSubject implements Subject {
        //储存观察者
        private List list=new ArrayList<>();
        //修改状态
        private String info;
    
        @Override
        public void addService(Object obj) {
            list.add(obj);
        }
    
        @Override
        public void disService(Object obj) {
            list.remove(obj);
        }
    
        @Override
        public void notifyObserver() {
            for(int i=0;i<list.size();i++){
                StudentObServce o =(StudentObServce)list.get(i);
                o.update(info);
            }
        }
    
        public void setTest(String info){
            this.info=info;
            System.out.println("狗群主发出信息:"+info);
            this.notifyObserver();
        }
    }
    package com.example.demo;
    
    import java.util.Observable;
    import java.util.Observer;
    
    //观察者的实现类
    public class StudentObServce implements ObServce {
        private String name;
        private TeacherSubject teacherSubject;
    
        public StudentObServce(String name,TeacherSubject teacherSubject){
            this.name=name;
            this.teacherSubject=teacherSubject;
            teacherSubject.addService(this);
        }
    
        @Override
        public void update(String info) {
            System.out.println(name+"群员收到了信息:"+info);
        }
    }
    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    public class DemoApplication {
    
        public static void main(String[] args) {
            //System.out.println("你好");
            TeacherSubject t=new TeacherSubject();
            StudentObServce zhangsan=new StudentObServce("张三",t);
            StudentObServce lisi=new StudentObServce("李四",t);
            StudentObServce wangwu=new StudentObServce("王五",t);
    
            t.setTest("测试1");
            t.setTest("测试2");
            t.setTest("测试3");
        }
    
    }
    狗群主发出信息:测试1
    张三群员收到了信息:测试1
    李四群员收到了信息:测试1
    王五群员收到了信息:测试1
    狗群主发出信息:测试2
    张三群员收到了信息:测试2
    李四群员收到了信息:测试2
    王五群员收到了信息:测试2
    狗群主发出信息:测试3
    张三群员收到了信息:测试3
    李四群员收到了信息:测试3
    王五群员收到了信息:测试3

          

  • 相关阅读:
    如何结合后台数据库 启动vue项目
    nodejs卸载安装
    mysql安装过程
    VUE-cli脚手架
    css伪类
    element中遇到的表格问题总结
    小程序折叠面板的功能
    vue学习中遇到的onchange、push、splice、forEach方法使用
    vscode好用的扩展及常用的快捷键
    Flutter之SliverAppBar
  • 原文地址:https://www.cnblogs.com/tysl/p/11121977.html
Copyright © 2020-2023  润新知