• 设计模式之观察者模式


    观察者模式又称为发布/订阅(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

          

  • 相关阅读:
    Struts2使用json中要注意的几点
    JS实现关闭当前子窗口,刷新父窗口
    oracle中rownum效率低的原因以及解决办法
    URL传中文参数引发的乱码问题
    oracle存储过程
    Map.keyset() 使用详解
    oracle跨库查询dblink的用法
    Java中getResourceAsStream的用法
    如何删除存在多个重复记录中的一个
    cocos2d里面如何实现mvc系列
  • 原文地址:https://www.cnblogs.com/tysl/p/11121977.html
Copyright © 2020-2023  润新知