观察者模式----用学生上课的例子讲

定义:

定义了对象之间一对多的依赖关系,当一个对象状态发生改变,其他的依赖于它的对象都能得到通知被被自动更新

结构:

指导思想:

主题维护所有的观察者,抽象观察者

解决的问题:

对象之间一对多的关系,一个对象的状态发生改变,依赖它的对象都将得到通知

实现方式:

在主题里维护一个观察者的列表,将观察者抽象出来,主题只需要知道对象是个观察者就行,就能调用更新方法

举例:

对于上课的场景,老师就是一种主题,学生就是观察者,当老师说要提问了,学生就接收到通知。


/**
 * 观察者接口
 *
 * @author trevor.zhao
 * @date 2021/5/21
 */
public interface Observer {
    void update(Boolean asking);
}

/*******************************/

/**
 * 好学生,是一个观察者
 */
public class GoodStudent implements Observer {
    private Teacher teacher;
    private String action;

    //构造的时候传入主题,注册为观察者
    public GoodStudent(Teacher teacher) {
        this.teacher = teacher;
        this.action = "好好听讲";
        teacher.registerObserver(this);
    }

    //被主题通知的时候调用
    @Override
    public void update(Boolean asking) {
        System.out.printf("我是好学生:");
        if (asking) {
            action = "老师提问了,准备举手回答";
            System.out.println(action);
        } else {
            action = "好好听讲";
            System.out.println(action);
        }

    }
}

public class BadStudent implements Observer {
    private Teacher teacher;
    private String action;

    public BadStudent(Teacher teacher) {
        this.teacher = teacher;
        this.action = "偷偷玩手机";
        teacher.registerObserver(this);
    }

    @Override
    public void update(Boolean asking) {
        System.out.printf("我是坏学生:");
        if (asking) {
            action = "躲躲闪闪,不要有眼神接触";
            System.out.println(action);
        } else {
            action = "接着玩手机";
            System.out.println(action);
        }

    }
}

/*********************************************/

/**
 * 老师,这里是一个主题
 *
 * @author trevor.zhao
 * @date 2021/5/21
 */
public class Teacher {
    private Boolean asking;
    private List<Observer> observerList;

    public Teacher() {
        this.asking = false;
        this.observerList = new ArrayList<>();
    }

    //注册观察者
    public void registerObserver(Observer observer) {
        observerList.add(observer);
    }

    //取消注册观察者
    public void unregisterObserver(Observer observer) {
        int index = observerList.indexOf(observer);
        if (-1 != index) {
            observerList.remove(observer);
        }
    }
    //通知观察者
    public void notifyObservers(){
        for (Observer o : observerList) {
            o.update(asking);
        }
    }
    //修改状态触发通知
    public void setAsking(Boolean asking) {
        this.asking = asking;
        notifyObservers();
    }
}

猜你喜欢

转载自blog.csdn.net/zjxht62/article/details/117523678
今日推荐