设计模式之观察者模式

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

 

      

posted @ 2019-07-02 17:29  入门小伙陶先生  阅读(316)  评论(0编辑  收藏  举报