美文网首页
java设计模式------观察者模式

java设计模式------观察者模式

作者: 我弟是个程序员 | 来源:发表于2017-10-23 13:49 被阅读0次

    该模式业务逻辑写在观察者模式中的观察者内,当被观察者发生改变时,通知观察者进行更新。

    类图:

    观察者模式
    一、自定义实现
    1.接口层
    • Subject接口:
    //被观察者接口
     interface Subject {
         //添加观察者
         void addObserver(Observer obj);
         //移除观察者
         void deleteObserver(Observer obj);
         //当主题方法改变时,这个方法被调用,通知所有的观察者
         void notifyObserver();
    }
    
    • Observer接口::
    //观察者接口
    interface Observer {
        //当主题状态改变时,会将一个String类型字符传入该方法的参数,每个观察者都需要实现该方法
        public void update(String info);
    }
    
    2.观察者与被观察者实体类
    • Subject接口实现类TeacherSubject:
    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) {
            int i = observers.indexOf(obj);
            if(i>=0){
                observers.remove(obj);
            }
        }
    
        @Override
        public void notifyObserver() {
            for(int i=0;i<observers.size();i++){
                Observer o=(Observer)observers.get(i);
                o.update(info);
            }
        }
        //布置作业的方法,在方法最后,需要调用notifyObserver()方法,通知所有观察者更新状态
        public void setHomework(String info){
            this.info=info;
            System.out.println("今天的作业是"+info);
            this.notifyObserver();
        }
    
    }
    
    • Observer接口实现类StudentObserver:
    public class StudentObserver implements Observer {
    
        //保存一个Subject的引用,以后如果可以想取消订阅,有了这个引用会比较方便
        private TeacherSubject t;
        //学生的姓名,用来标识不同的学生对象
        private String name;
        //构造器用来注册观察者
        public Student(String name,Teacher t) {
            this.name=name;
            this.t = t;
            //每新建一个学生对象,默认添加到观察者的行列
            t.addObserver(this);
        }
    
    
        @Override
        public void update(String info) {
            System.out.println(name+"得到作业:"+info);        
        }
    
    }
    
    3.测试

    测试代码:

     public static void main(String[] args) {
            
            TeacherSubject teacher=new TeacherSubject();
            StudentObserver zhangSan=new StudentObserver("张三", teacher);
            StudentObserver LiSi=new StudentObserver("李四", teacher);
            StudentObserver WangWu=new StudentObserver("王五", teacher);
            
            teacher.setHomework("第二页第六题");
            teacher.setHomework("第三页第七题");
            teacher.setHomework("第五页第八题");
        }
    

    测试结果:

    测试结果
    二、java内置的观察者模式
    1.被观察者
    
    import java.util.Observable;
    
    /**
     * java内置的观察者模式
     */
    public class Teacher extends Observable {
        private String info;
    
        public void setHomework(String info) {
    
            this.info = info;
            System.out.println("布置的作业是" + info);
    
            setChanged();
            notifyObservers();
        }
    
        public String getInfo() {
            return info;
        }
    }
    
    2.观察者
    package com.sqlb.observer;
    
    import java.util.Observable;
    import java.util.Observer;
    
    /**
     *java内置的观察者模式
     */
    public class Student implements Observer {
    
        private Observable ob;
        private String name;
    
        public Student(String name,Observable ob) {
            this.ob = ob;
            this.name=name;
            ob.addObserver(this);
        }
    
        public void update(Observable o, Object arg) {
            Teacher t=(Teacher)o;
            System.out.println(name+"得到作业信息:"+t.getInfo());
    
        }
    }
    
    3.测试
            Teacher teacher=new Teacher();
            Student zhangSan=new Student("张三", teacher);
            Student LiSi=new Student("李四", teacher);
            Student WangWu=new Student("王五", teacher);
    
            teacher.setHomework("第二页第六题");
            teacher.setHomework("第三页第七题");
            teacher.setHomework("第五页第八题");
    

    结果和上面的一样。

    本文参考了这里,如有侵权行为,可直接联系作者及时更正。

    相关文章

      网友评论

          本文标题:java设计模式------观察者模式

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