美文网首页
观察者模式 java

观察者模式 java

作者: iarchitect | 来源:发表于2018-09-14 16:08 被阅读0次

    观察者模式又称为订阅/发布模式
    该模式定义了对象之间的一对多的依赖关系,这样,当“一”的一方状态发生变化时,它所依赖的多方都会受到通知并自动更新

    举例:一个老师对应多个学生,老师发布作业,学生接收作业。

    public interface Observer {
        //当主题改变时,会将一个String类型字符串传入该方法,每个观察者都需要实现该方法
        public void update(String info);
    }
    
    
    public interface Subject {
        //添加观察者
        void addObserver(Observer obj);
        //移除观察者
        void deleteObserver(Observer obj);
        //当方法主题改变时,这个方法被调用,通知所有的观察者
        void notifyObserver();
    }
    
    
    public class StudentObserver implements Observer {
    
        //保存一个Subject的引用,便于取消订阅
    
        private TeacherSubject t;
        //学生姓名
        private String name;
        //构造器,用于注册观察者
    
        public StudentObserver(String name, TeacherSubject t) {
            this.name = name;
            this.t = t;
            t.addObserver(this);
        }
    
        public TeacherSubject getT() {
            return t;
        }
    
        @Override
        public void update(String info) {
            System.out.println(name+"得到作业"+info);
        }
    }
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class TeacherSubject implements Subject {
    
        //用来存放和记录观察者
        private List<Observer> observers = new ArrayList<Observer>();
        //记录状态的字符串
        private String info;
    
        @Override
        public void addObserver(Observer obj) {
            observers.add(obj);
        }
    
        @Override
        public void deleteObserver(Observer obj) {
            observers.remove(obj);
        }
    
        @Override
        public void notifyObserver() {
            for(Observer observer:observers){
                observer.update(info);
            }
        }
        //布置作业的方法,在方法最后,调用notifyObserver()方法,通知所有的观察者更新状态
        public void setHomework(String info){
            this.info=info;
            System.out.println("今天的作业是"+info);
            this.notifyObserver();
        }
    }
    
    
    public class TestObserver {
        public static void main(String[] args) {
            TeacherSubject teacherSubject = new TeacherSubject();
            StudentObserver xiaoming = new StudentObserver("xiaoming",teacherSubject);
            StudentObserver xiaohong = new StudentObserver("xiaohong",teacherSubject);
    
            teacherSubject.setHomework("第一章第一题");
    
            xiaohong.getT().deleteObserver(xiaohong);
            teacherSubject.setHomework("第一章第二题");
    
        }
    }
    
    

    输出结果:


    image.png

    相关文章

      网友评论

          本文标题:观察者模式 java

          本文链接:https://www.haomeiwen.com/subject/ulrsgftx.html