观察者模式 java

2018-09-14  本文已影响0人  iarchitect

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

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

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
上一篇 下一篇

猜你喜欢

热点阅读